3
#include <iostream>
#include <ctype.h>

using namespace std;

void isPalindrome();

int main()
{
    char response;
    isPalindrome();
    cout << "Input another string(y/n)?" << endl;
    cin >> response;
    response = toupper(response);
    if (response == 'Y')
        isPalindrome();

    return 0;
}

void isPalindrome()
{
    char str[80], str2[80];
    int strlength;
    int j = 0;
    int front, back;
    bool flag = 1;

    cout << "Input a string:" << endl;
    cin.getline(str, 80);
    strlength = strlen(str);

    for (int i = 0; i < strlength; i++)
    {
        if (islower(str[i]))
            str[i] = toupper(str[i]);
    }

    for (int i = 0; i < strlength; i++)
    {
        if (isalpha(str[i]))
        {
            str2[j] = str[i];
            j++;

        }
    }

    str2[j] = '\0';
    front = 0;
    back = strlength - 1;

    for (int i = 0; i < j / 2; i++)
    {
        if (str2[front] != str2[back])
        {
            flag = 0;

            break;
        }
    }

    if (!(flag))
        cout << "It is not a palindrome" << endl;
    else
        cout << "It's a palindrome" << endl;

    cout << "str: " << str << " str2: " << str2 << " strlength: " << strlength << " j: " << j << endl;
    cout << "front: " << front << " back: " << back << " flag: " << flag << endl;
}

我只是想知道是否有人可以帮助向我解释为什么我的代码不起作用。

我可以运行一次就好了,我得到了正确的答案,但是当提示询问我是否要输入另一个字符串并输入'y'时,提示只是跳过输入并自行终止。

我试过cin.ginore('\n', 80)了,但这只是给了我一堆空白行。我在最后添加了一些代码来检查值,它们都去0并删除了字符串。

也许是系统如何处理内存的正确解释的链接?

编辑:第二次运行输入序列时,我一直遇到同样的问题。输出如下所示:

    Input a string:
    Radar
    It's a palindrome
    Input another string(y/n)?
    y


    _ <- this being my cursor after pressing enter 3 times

我只是从头开始重新构建程序并尝试在没有函数的情况下完成它。我仍然很感激一个指向解释如何使用现代 c++ 处理用户输入的页面的链接。

4

3 回答 3

1

问题在于:

cin >> response;

这会将用户输入读取y/n到变量response中,但在输入缓冲区中留下一个换行符,该换行符由getline函数isPalindrome函数拾取。

要解决此问题,您需要在读取用户响应后从输入缓冲区中删除换行符。您可以使用:

cin >> response;
std::cin.ignore(INT_MAX);

通过上述修复,您可以重试回文检查一次。要使多次重试成为可能,您需要一个循环。我会do-while在你的 main 中推荐一个循环:

char response;
do {
        isPalindrome();
        cout << "Input another string(y/n)?" << endl;
        cin >> response;
        std::cin.ignore(INT_MAX);
        response = toupper(response);
} while(response == 'Y');
于 2011-11-24T03:46:49.303 回答
0

你需要一个循环。没有指示程序返回顶部的代码。

char response = 'Y';
while (response == 'Y') {
    isPalendrome();
    cout << "Input another string(y/n)?" << endl;
    cin >> response;
}

这不是您的整个程序,只是您在 while 循环中需要的关键元素。您应该了解 while 的工作原理,并使其适用于您的程序。

于 2011-11-24T03:39:30.827 回答
0

在当代 C++ 中,通常会使用标准库组件进行字符串处理:

#include <iostream>
#include <string>

int main()
{
    std::string line1, line2, response;

    do
    {
        std::cout << "First string: ";
        if (!std::getline(std::cin, line1)) { /* error */ }

        std::cout << "Second string: ";
        if (!std::getline(std::cin, line2)) { /* error */ }

        // check line1 and line2 for palindromy

        std::cout << "Again (y/n)? ";
        std::getline(std::cin, response);

    } while (std::cin && (response == "y" || response == "Y"));
}
于 2011-11-24T04:36:13.140 回答