2016-07-18 20 views
-4

以下は、逆引き操作を実装する回文関数とヘルパー関数です。何らかの理由で、型が同じであるように見えても、if比較ステートメントは決してtrueに評価されません。変数sとcompの両方が文字列であるように見えますが、私はsti()を両方ともintに変換しようとしましたが、何らかの理由でcompがエラーをスローします:文字列の反転後の文字列比較関数の問題

std :: invalid_argument ' what():stoi 中止(コアダンプ)

問題の内容がわかりません。

bool palindrome (int n) 
{ 

    string s = to_string(n); 
    cout << s << endl; 
    string comp = rev(s); 
    cout << comp << endl; 

    if (s == comp) 
    { 
     cout << s << " " << comp << endl; 
     return 1; 
    } 
    return 0; 

} 

string rev (string &s) 
{ 

    string return_string(""); 

    for (string::iterator it = s.end(); it != (s.begin() - 1); it--) 
    { 
     return_string += *it; 
    } 

    return return_string; 

} 
+1

はしましたか? – OldProgrammer

+0

@LogicStuff:これは完全に動作します。逆の文字列を新しい文字列にコピーします。 – Isthisathing

+1

私はあなたが['std :: string :: rbegin'](http://www.cplusplus.com/reference/string/string/rbegin/)を見てみることをお勧めします – lcs

答えて

2

for (string::iterator it = s.end(); it != (s.begin() - 1); it--)が間違っています。最初の反復では、s.end()を逆参照し、次にs.begin()の前に逆参照します。これは未定義の動作です(s.begin() - 1でさえ)。

利用リバースイテレータ:

for(auto it = s.rbegin(); it != s.rend(); ++it) 
3

あなたrev関数は2個のエラーがあります。まず、(s.begin() - 1)を計算します。第2に、その最初の反復では、それは逆参照s.end()です。どちらも未定義の動作です。

あなたは逆イテレータを使用して少数の問題があるでしょう:

string rev(const string& s) 
{ 
    string return_string; 
    for (auto it = s.rbegin(); it != s.rend(); ++it) 
    { 
     return_string += *it; 
    } 

    return return_string; 
} 
0
for (string::iterator it = s.end(); it != (s.begin() - 1); it--) 
{ 
    return_string += *it; 
} 

エンド()コンテナの端部を越えて1ポイントなので、あなたはそれを逆参照自分が所有していないメモリにアクセスしているとき。 また、コンテナの開始前にアドレスにbegin()を減らすことで、所有していないより多くのメモリにアクセスしようとしています。

そうのように、最後に逆転し、開始リバース、リバースイテレータを使用してみてください:あなたは、デバッガでコードをステップ

string rev(const string &s) 
{ 
    string return_string(""); 
    for (string::const_reverse_iterator rit = s.rbegin(); rit != s.rend(); ++rit) 
    { 
     return_string += *rit; 
    } 

    return (return_string); 
}