无法通过循环运行我的代码,但手动复制和粘贴工作

时间:2014-02-20 23:30:29

标签: c++ string recursion while-loop indexoutofboundsexception

这段代码有效。我也可以在我的主要内部从头到尾复制粘贴几次,它仍然可以工作。

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

2 个答案:

答案 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语句来处理。