2016-08-09 10 views
0

繰り返し文字のカウントを使用して文字列圧縮を実行するプログラムを作成しました。 C++でのプログラムは次のとおりです。std :: string不適切な値を返す

#include<iostream> 
#include<cstring> 
std::string compressBad(std::string str) 
{ 
    std::string mystr = ""; 
    int count = 1; 
    char last = str[0]; 
    for (int i = 0; i < str.length();++i) 
    { 
     if(str[i] == last) 
      count++; 
     else 
     { 
      std::string lastS = last+""; 
      std::string countS = std::to_string(count); 
      mystr.append(lastS); 
      mystr.append(countS); 
      //mystr = mystr + last + count; 
      count = 1; 
      last = str[i]; 
     } 
    } 
    std::string lastS = last+""; 
    std::string countS = std::to_string(count); 
    mystr.append(lastS); 
    mystr.append(countS); 
    return mystr;   
    //return mystr+last+count; 
} 
int main() 
{ 
    std::string str; 
    std::getline(std::cin, str); 
    std::string str2 = compressBad(str); 
    std::cout<<str2; 
    /*if (str.length() < str2.length()) 
     std::cout<<str; 
    else 
     std::cout<<str2;*/ 
    std::cout<<std::endl; 
    return 0; 
} 

少数の例でこれを実行するには、次のとおりです。私はまた、Javaで同じコンセプトを実装し、そこにそれが働いている

Input : sssaaddd 

Output: ùÿÿ*423 

Output it should print : s3a2d3 

Input : sssaaddddd 

Output : ùÿÿ*425 

Output it should print : s3a2d5 

第二の例良い。 Javaの実装はhere

なぜ上記のコードで起こっているのですか?

+0

を行う* - 。話の教訓を - C++は、* * Javaのではありません。 Javaをモデルとして使用してC++コードを作成しないでください。以下の答えは、Javaの同じコードがC++の場合と同じように動作すると考えたときのトラブルを示しています。 – PaulMcKenzie

答えて

6

あり、あなたのコード内の他の問題も、私は、この行を非難するかもしれないと思うことがあります。

ここ
std::string lastS = last+""; 

、あなたは空の文字列を連結した文字列に文字lastを変換しようとしています最後まで。残念なことに、C++では、これは「文字lastの数値をとり、それを空の文字列を指すポインタに追加し、文字への新しいポインタを生成する」と解釈されます。このポインタはランダムなメモリを指しており、あなたが見ているガベージを指します。 (これは、Javaがどのように機能するかは異なるかなりであることに注意!)

std::string lastS(1, last); 

を読み取るために、この行を変更してみてくださいこれはlastに保存されているだけの文字からなる文字列であることをlastSを初期化します。

別のオプションは、ostringstreamを使用することです:

std::ostringstream myStr; 
myStr << last << count; 

// ... 

return myStr.str(); 

これは.append()std::to_stringへのすべての呼び出しを排除し、おそらく読みずっと簡単です。

1

last + ""あなたの考えはしません。私はまた、Javaで同じコンセプトを実装し、そこにそれが正常に動作している*

がちょうど

mystr.append(1, last); 
関連する問題