2

私は C++ に精通していますが、同じ文字列または異なる文字列のインデックス付き文字を比較する方法がわかりません。次に、int を取り、stringstream を介して文字列に変換する回文の例を示します。

bool ispalindrome(int a) {
    stringstream stream;
    stream<<a;
    string str = stream.str();
    int length = str.length();
    int offset = length - 1;
    for (int i=0; i<=offset; i++ && offset--) {
        if (str[i] == str[i + offset]) {
            return false;
        }
        offset--;
    }
    return true;
}

何らかの理由で、これは常に false と評価されます。長さで報告されていないため、ヌル終了はそれと関係があるとは思わないので、間違った比較方法を使用しているに違いないと思います。strncmp のようなものを見つけることができないようですが、単一の文字が含まれています。

[編集: 固定タイトル]

4

5 に答える 5

5

あなたがそのループをどのように書いたかはわかりませんが、そうすべきだと確信しています

for (int i=0; i<=offset; i++, offset--) {
    if (str[i] != str[offset]) {
        return false;
    }
}
于 2012-07-23T20:02:42.210 に答える
1

カンマを使用している可能性があります。

for (int i=0; i<=offset; i++ ,offset--)

より一般的ですか?

そうしないと、

if (str[i] == str[i + offset]) {

「==」ではなく「!=」の方が良い

しかし、単純なサンプルでは、​​「常に偽」の動作は見られません

int main() {
  for ( int i = 0; i < 1000; ++i )
  cout << i << " = " << ispalindrome(i) << endl;
}
于 2012-07-23T20:10:38.433 に答える
1

イテレータを使用できます:

std::string::iterator start = str.begin();
std::string::reverse_iterator end = str.rbegin();

int halfWay = str.length() / 2;

for (int i = 0; i <= halfWay; i++, start++, end++)
{
    if (*start != *end)
        return false;
}

return true;

免責事項: テストしていませんが、私は C++ があまり得意ではありません。

于 2012-07-23T20:13:48.993 に答える
0

回文をチェックするだけの場合はreverse、STLからも使用できます

#include <algorithm>
#include <string>

bool isPalinDrome = false;

std::string mystr = "cnc";
std::string mystrcpy = mystr;
std::reverse(mystrcpy.begin(),mystrcpy.end());
if(mystr == mystrcpy)
isPalindrome =  true;

しかし、個々のキャラクターを比較しているだけなら、上記の答えはすでにその方法を教えてくれます. 繰り返しになりますが、どちらの方法でも文字列の途中までトラバースするだけで済みます

于 2016-02-06T05:24:23.177 に答える
0

チェック条件は次のとおりです。

    if (str[i] != str[i + offset]) {
               ^--here
于 2012-07-23T20:04:55.580 に答える