这段代码有效。我也可以在我的主要内部从头到尾复制粘贴几次,它仍然可以工作。
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; // End
cout << "\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 :(得分:2)
尝试以下功能
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和运算符&gt;&gt;同时你应该使用忽略跳过ENTER键
(不要忘记包括<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读取一个空字符串。所以str是空的。在函数testPalindrome中有语句
for (int i = 1; i < str.length() - 1; i++)
对于空字符串,其长度等于0,然后是表达式
str.length() - 1
具有无符号类型的最大值,因为此表达式的类型是一些无符号整数类型,-1的内部表示对应于maximim无符号值。 因此变量i将始终小于-1并且您将获得内存访问冲突。
另外,我会使用另一个循环而不使用其他变量i。
while ( true )
{
cout << "Input a palindrome: ";
string str;
getline(cin, str);
if ( str.empty() ) break;
//...
}
答案 1 :(得分:0)
if (newStr.length()>1)
仅在newStr.length()> 1时处理条件。当条件:if (newStr.length()>1)
为false时,您需要一个else语句来处理。