Этот бит кода работает. Я также могу скопировать вставку от начала до конца несколько раз внутри своей основной, и она все еще будет работать.
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;
}
Попробуйте следующую функцию
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;
//...
}
if (newStr.length()>1)
обрабатывает условие, только когда newStr.length ()> 1. Вам нужен оператор else для обработки, когда условие: if (newStr.length()>1)
ложно