программа пропустить через getline

0

Я предполагаю создать такую программу, чтобы при вводе 'y' он выполнял код в первом цикле do-while. однако, когда вводится 'y' он просто пропускает кусок кодов!

Введите символы телефона:

2

Продолжить (Y/y): y

Введите символы телефона:

Продолжить (Y/y):

В любом случае, я могу решить это без использования cin.ignore поскольку он изменяет макет. Заранее спасибо!

#include <iostream>
#include <cstdlib>
#include <cctype>
#include <iomanip>
#include <cstring>

const int MAX = 100;

using namespace std;

int getInt(char);
bool isValidChar(char);

int main()
{
    int num;
    int j = 0;
    char name, conti;
    char alpha[MAX];

    do {
        cout << "Enter a phone symbols: " << endl;
        cin.getline(alpha, MAX);
        // cin.ignore(100, '\n');

        while (alpha[j] != '\0')
        {
            name = alpha[j];

            if (isValidChar(name) == true)
            {

                num = getInt(name);

                if (num == -1)
                {
                    cout << "-";
                }
                else
                {
                    cout << num;
                }
            }
            else
            {
                cout << " - Invalid Char " << name << " found - rejected";
            }

            j++;
        } // end while

        cout << endl;

        do {
            cout << "\nContinue (Y/y): ";
            cin >> conti;
            cout << "\n" << endl;
            conti = tolower(conti);

            if (conti == 'n')
            {
                exit(0);
            }

        } while (conti != 'n' && conti != 'y');

    } while (conti == 'y');

}

int getInt(char input)
{
    int result;
    char value;
    value = tolower(input);
    if ((value >= 'a' && value <= 'c'))
    {
        result = 2;
    }
    else if ((value >= 'd' && value <= 'f'))
    {
        result = 3;
    }
    else if ((value >= 'g' && value <= 'i'))
    {
        result = 4;
    }
    else if ((value >= 'j' && value <= 'l'))
    {
        result = 5;
    }
    else if ((value >= 'm' && value <= 'o'))
    {
        result = 6;
    }
    else if ((value >= 'p' && value <= 's'))
    {
        result = 7;
    }
    else if ((value >= 't' && value <= 'v'))
    {
        result = 8;
    }
    else if ((value >= 'w' && value <= 'z'))
    {
        result = 9;
    }
    else if (value == ' ')
    {
        result = -1;
    }
    return result;
}

bool isValidChar(char value)
{
    if (isalpha(value) || value == ' ')
    {
        return true;
    }
    else
    {
        return false;
    }
}
  • 0
    Этот внутренний вложенный цикл do-while не нужен. Также используйте std::string .
  • 1
    Я получил код для работы вынимая ненужный вложенный цикл Do-While, сбрасывая j до 0 после того, как внутренние , while петли, и добавления ss.ignore() после cin >> conti . Вызов ignore() необходим, поскольку неформатированный ввод не сможет продолжаться, если в начале потока застряла новая строка. Вы можете найти свой рабочий код здесь.
Показать ещё 3 комментария
Теги:
cin
getline

1 ответ

0

Что вы имеете в виду: есть ли в любом случае я могу решить это, не используя cin.ignore, поскольку он меняет макет. ?

Ваш макет задан, в основном по этой строке:

cout << "\nContinue (Y/y): ";
cin >> conti;
cout << "\n" << endl;   // <-- this one
conti = tolower(conti);

Если вы его подавите, пустая строка не будет. В противном случае, если вы измените его на

cout << endl;

Только одна пустая строка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню