Что не так с моим кодом палиндрома предложений (C ++)? - PullRequest
0 голосов
/ 04 августа 2020

Приведенный ниже код относится к программе проверки палиндрома предложений. Я новичок ie программист, поэтому мне сложно отлаживать этот код. Он показывает неправильный вывод. Например, предложение «Человек, план, канал: Панама» дает ложный результат вместо истинного. (Пробелы и знаки препинания следует игнорировать.)

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

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

Проблема очень вероятно, что функции классификации символов (например, ispunct) не возвращают результат bool.

Они возвращают int, значение которого может быть любое ненулевое значение для «истины».

Это означает, что условие вроде ispunct(s[i]) == true может фактически быть false для знаков пунктуации.

Вместо этого вам нужно использовать, например, ispunct(s[i]) != 0 (или просто ispunct(s[i])).

0 голосов
/ 04 августа 2020

И еще, это не то, как проверяют палиндром. Предлагаю следующий код:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...