有简单的回文程序的麻烦

时间:2016-12-19 01:22:42

标签: c++

我正在尝试编写一个简单的c ++程序,让用户知道他们输入的单词是否是回文。例如:'妈妈'是回文。

这就是我所拥有的:

#include <iostream>
#include <string>

using namespace std;

// Forward Declaration
string reversed_string(string);


int main(){
    string str;
    string reversed;
    cout << "Enter string to check:\n";
    getline(cin, str);

    reversed = reversed_string(str);

    if(str == reversed){
        cout << str << " is palindrome\n\n";
    }
    else{
        cout << "Not palindrome";
    }
}

string reversed_string(string str){
    string reversed;

    for(int i = int(str.length()); i >= 0; i--){
        reversed += str[i];
    }
    return reversed;
}

当我尝试输入回文词时,它总是转到我的main函数中的else语句。我做错了什么?

1 个答案:

答案 0 :(得分:1)

字符串的最后一个字符位于索引len - 1,而不是len。根据标准(C ++ 11):

  

如果*(begin() + pos),则返回pos < size()。否则,返回对charT类型的对象的引用,其值为charT(),其中修改对象会导致未定义的行为。

该标准实际上意味着,如果pos不小于字符串长度,则该函数返回对空字符的引用。因此,您将放入反向字符串的第一个字符为空。

但是,你真的不需要反转字符串来查找它是否是回文,可能更容易简单地使用以下(伪代码)算法:

def isPalindrome(string):
    set left to zero
    set right to one less than string length
    while left is less than right:
        if string[left] is not equal to string[right]:
            return false
        add one to left
        subtract one from right
    return true

鉴于你必须处理每个字符以形成反向字符串,你也可以使用该处理能力来检查原始字符串中的字符。这样,如果它不是回文,你可以提前退出。

当然,这会将空字符串视为回文,这可以说是正确的。如果您认为这是正确的,只需先检查一下:

def isPalindrome(string):
    if string length is zero:
        return false
    set left to zero
    ... and so on