我的句子回文代码(C++)有什么问题?

What is wrong with my sentence palindrome code (C++)?

下面的代码是一个句子回文检查器。我是一名新手程序员,所以我很难调试这段代码。它显示不正确的输出。 例如,如果句子是“一个人,一个计划,一条运河:巴拿马” 它给出的结果是 false 而不是 true。 (忽略空格和标点符号。)


#include <iostream>

class Solution
{
public:
    bool isPalindrome(std::string s)
    {
        int l, i;
        i = 0;
        l = s.length();

        while (i <= (l - 1))
        {

            if (s[i] == ' ' || ispunct(s[i]) == true)
                i++;

            else if (s[l - 1] == ' ' || ispunct(s[l - 1]) == true)
                l--;

            else if (tolower(s[i]) == tolower(s[l - 1]))
            {
                l--;
                i++;
            }

            else
                return false;
        }
        return true;
    }
};

int main(void)
{
    Solution s;
    const std::string text = "Panama";

    std::cout << s.isPalindrome(text);

    return 0;
}

问题很可能是 character classification functions(例如 ispunct不是 return bool 结果.

他们 return 一个 int 其值可以是 any non-zero 值“真”。

这意味着像 ispunct(s[i]) == true 这样的条件对于标点符号实际上可能是 false

您需要使用例如ispunct(s[i]) != 0(或只是简单的 ispunct(s[i]))。

而且,这不是检查回文的方式。我建议使用以下代码:

#include <iostream>

int main() {
    std::string str;
    std::cin >> str;
    for (auto i = 0, j = str.size() - 1; i < j; i++, j--) {
        if (//check for punctuation) {

        }
        else if (str.at(i) != str.at(j)) {
            //not a palindrome
            break;
        }
    }
    return 0;
}