Невозможно ввести более одной строки в программе палиндрома - PullRequest
3 голосов
/ 24 ноября 2011
#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 ++.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Проблема с:

cin >> response;

Это читает пользовательский ввод y/n в переменную response, но во входном буфере остается новая строка, которая выбирается функцией getlineisPalindrome function.

Чтобы исправить это, вам нужно удалить символ новой строки из буфера ввода после того, как вы прочитаете ответ пользователя.Вы делаете это с помощью:

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

С помощью вышеуказанного исправления вы можете повторить проверку палиндрома только один раз.Чтобы сделать возможным несколько повторных попыток, вам понадобится цикл.Я бы порекомендовал петлю do-while в вашем основном как:

char response;
do {
        isPalindrome();
        cout << "Input another string(y/n)?" << endl;
        cin >> response;
        std::cin.ignore(INT_MAX);
        response = toupper(response);
} while(response == 'Y');
0 голосов
/ 24 ноября 2011

В современном 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"));
}
0 голосов
/ 24 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...