нежелательный вывод программы Palindrome с использованием C ++ - PullRequest
0 голосов
/ 03 февраля 2019

Итак, я начал изучать C ++ две недели назад и хочу создать программу, которая проверяет, является ли строка палиндромом или нет.Я пробовал разные способы, включая метод str1 == str2, следующим образом:

#include<iostream>
#include<string>
using namespace std;

string empty;
string word;
bool inverse(string word)
{

    for (int i=0;i<=word.length();i++)
    {
         empty+=word[word.length()-i];
    }
    return empty==word;
}

int main()
{ 

    cout<<inverse("civic");

}

Выход всегда 0

Второй способ: метод str1.compare (str2)

#include<iostream>
#include<string>
using namespace std;

string empty;
string word;
bool inverse(string word)
{

for (int i=0;i<=word.length();i++)
{empty+=word[word.length()-i];}

if (word.compare(empty))
return true;
else
return false;


}

int main()
{ 

if (inverse(word)==true)
cout<<"is a palindrome";
else
cout<<"is not a palindrome";
cout<<inverse("ano");
cout<<inverse("madam");
}

вывод всегда: это палиндром1 (с 1 или 2 в конце «палиндром»), даже если строка не палиндром.

пожалуйста, объясните мне, какие ошибки я допустили как я могу их исправить.Кроме того, если я хочу, чтобы моя программа обрабатывала строку с пробелами, как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Есть пара проблем

  1. Ваш код зацикливается слишком много раз.Например, слово из трех букв должно повторяться три раза, а ваш код - 4 (i=0, i=1, i=2 и i=3).Чтобы исправить это, вам нужно изменить конечное условие, чтобы использовать < вместо <=.

  2. Вы вычисляете симметричный индекс по неправильной формуле.Например, если у вас есть слово длиной три, буквы будут word[0], word[1] и word[2].Однако ваш код использует length - i, а для i=0 это будет использовать word[3], что выходит за допустимые пределы для слова.Вам нужно выполнить индексацию, используя в качестве формулы length - 1 - i вместо length - i.

Обе эти ошибки довольно распространены в программировании и называются «по одному»"ошибки.Не забывайте всегда перепроверять граничные условия при написании кода, чтобы избежать подобных ошибок в своих программах.

0 голосов
/ 03 февраля 2019

Поведение вашей программы станет неопределенным после этой строки:

for (int i = 0;i <= word.length(); i++)
    empty += word[word.length() - i];

Так как длина всегда один плюс последний элемент (Так как первый индекс ноль ), когда i равен 0, тогда: word[word.length()] даст вам элемент после последнего элемента, что невозможно, и, таким образом, ваша программа вызовет неопределенное поведениепоскольку C / C ++ ... word[word.length()] также возможна, когда i само становится word.length(), поэтому измените <= (меньше или равно) на < (меньше)

, должно быть:

for (int i = 0;i < word.length(); i++)
    empty += word[word.length() - 1 - i];
0 голосов
/ 03 февраля 2019

Для первого вам нужно изменить

for (int i=0;i<=word.length();i++)
{empty+=word[word.length()-i];}

на этот

for (int i=0;i<word.length();i++)
{empty+=word[word.length()-(i+1)];}
...