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;
}

由于某种原因,这总是被评估为假。我认为空终止与它没有任何关系,因为它没有按长度报告,所以我想我一定使用了错误的比较方法。我似乎找不到类似 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

您的检查条件应该是:

    if (str[i] != str[i + offset]) {
               ^--here
于 2012-07-23T20:04:55.580 回答
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 回答