Не могу запустить мой код через цикл, однако копирование и вставка вручную работает

Этот бит кода работает. Я также могу скопировать вставку от начала до конца несколько раз внутри своей основной, и она все еще будет работать.

int main()
{
string str;

cout << "Input a palindrome: "; // Start
getline(cin, str);

if (testPalindrome(str) == 1)
cout << "Your input is a palindrome: True" << endl;
else
cout << "Your input is a palindrome: False" << endl;

cout << endl; // Endcout << "\nCreated by,\nNorman Ettedgui" << endl;
system("pause");
return 0;
}

Однако этот фрагмент кода не будет работать, и ошибка, которую я получаю, является строкой, выходящей за пределы моей функции (как ни странно, перед вызовом функции).

Это моя функция testPalindrome:

bool testPalindrome(string str)
{
string newStr;

for (int i = 1; i < str.length() - 1; i++)
newStr += str[i];

if (newStr.length() > 1)
testPalindrome(newStr);

if (str[0] == str[str.length() - 1])
return true;
}

Это то, что я пытаюсь запустить:

int main()
{
string str;

int i = 0;

while (i != -1)
{
cout << "Input a palindrome: ";
getline(cin, str);

if (testPalindrome(str) == 1)
cout << "Your input is a palindrome: True" << endl;
else
cout << "Your input is a palindrome: False" << endl;

cout << "-1 to Exit or any other number to continue: ";
cin >> i;

cout << endl;
}

cout << "\nCreated by,\nNorman Ettedgui" << endl;
system("pause");
return 0;
}

0

Решение

Попробуйте следующую функцию

bool testPalindrome( string s)
{
return ( s.size() < 2 ? true
: s.front() == s.back() && testPalindrome( s.substr( 1, s.size() -2 ) ) );
}

Также в основном заменить это утверждение

if (testPalindrome(str) == 1)

за

if ( testPalindrome(str) )

Если вы используете getline и operator >> одновременно, то вы должны использовать ignore, чтобы пропустить клавишу ВВОД
(Не забудьте включить <limits>)

#include <limits>
while (i != -1)
{
cout << "Input a palindrome: ";

cin.ignore( numeric_limits<streamsize>::max() );
getline(cin, str);

//...
cin >> i;

cout << endl;
}

Я объясню вам, почему вы получили ошибку. Без оператора с вызовом функции ignore getline считывает пустую строку. Так что ул был пуст. В функции testPalindrome есть утверждение

for (int i = 1; i < str.length() - 1; i++)

Что касается пустой строки, то ее длина равна 0, тогда выражение

str.length() - 1

имеет максимальное значение для типа без знака, потому что типом этого выражения является некоторый целочисленный тип без знака, а внутреннее представление -1 соответствует максимальному значению без знака.
Таким образом, переменная I будет всегда меньше -1, и вы получите нарушение доступа к памяти.

Также я бы использовал другой цикл без использования дополнительной переменной i.

while ( true )
{
cout << "Input a palindrome: ";

string str;
getline(cin, str);

if ( str.empty() ) break;

//...
}
2

Другие решения

if (newStr.length()>1) обрабатывает условие, только когда newStr.length ()> 1. Вам нужен оператор else для обработки, когда условие: if (newStr.length()>1) ложно

0

По вопросам рекламы [email protected]