Как принимать целочисленные входные значения в разных строках без использования getline ()? - PullRequest
3 голосов
/ 09 мая 2020

Например, мне нужно принять размеры двух прямоугольников на разных линиях.

Я пробовал вот так:

int a1, b1, a2, b2;
char c;
cin >> a1 >> b1;
cin >> c >> a2 >> b2;

1 Ответ

0 голосов
/ 09 мая 2020

Итак, вы хотите, чтобы пользователь вводил эти 4 целые числа следующим образом:

-10 0
30 40

И вы хотите отклонить все другие форматы ввода ...

Другими словами, ввод должен включать:

  • 4 int целые числа

  • 2 ' ' пробелы

  • 2 '\n' новые строки

Вы можете изменить лог c Я собираюсь обсудить настройку этих параметров по мере необходимости .


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

Вот мое мнение по этому поводу:

  1. Считайте вводимый символ (char ch) по символам, пока не получите четыре отдельных (разделенных пробелом или новой строкой) входы (может быть что угодно, включая void, проверка может быть выполнена позже). Используйте std::stringstream (stringstream input), чтобы прочитать весь ввод; это упростит проверку ввода по мере продолжения. Имейте две переменные (unsigned spaceCount = 0; и unsigned newlineCount = 0;) для управления завершением l oop.

    while (newlineCount + spaceCount != 4)
    {
        ch = cin.get();
        input << ch;
    
        if (ch == ' ')
            ++spaceCount;
    
        if (ch == '\n')
            ++newlineCount;
    }
    
  2. Прежде чем продолжить, вам понадобится функция, например bool isInt(string num), чтобы проверить, работает ли заданная строка является целым числом или нет . Вы можете сделать его самостоятельно в соответствии с вашими потребностями. У Stackoverflow уже есть поток по этому поводу: Как определить, является ли строка числом с помощью C ++? Функция должна возвращать true, только если строка может быть помещена в int.

  3. Затем вы можете проверить вводимые пользователем данные на наличие скрытых драгоценных камней, не входных данных или спама:

    bool inputFormatCorrect = true;
    if (spaceCount == 2 && newlineCount == 2)
    {
        stringstream tmpInput;
        string tmpStr;
        tmpInput << input.str();
        for (int i = 0; i < 4; ++i)
        {
            tmpInput >> tmpStr;
            if (!isInt(tmpStr))
            {
                inputFormatCorrect = false;
                break;
            }
        }
    }
    else
    {
        inputFormatCorrect = false;
    }
    
  4. После завершения проверки вы можете извлечь и отобразить ваши целые числа (int a1, b1, a2, b2;):

    if (inputFormatCorrect)
    {
        input >> a1 >> b1 >> a2 >> b2;
        cout << "a1 = " << a1 << ", b1 = " << b1 << ", a2 = " << a2 << ", b2 = " << b2;
    }
    else
    {
        cout << "I don't like your style of inputting...";
    }
    
  5. Собираем все вместе: Live Demo И Я не совсем уверен, нужно ли вам ограничение на пробелы, но вы можете изменить logi c, чтобы удалить все вхождения spaceCount и при необходимости изменить условие чтения l oop на while (newlineCount != 2).


Итак, вы действительно хотели все усложнить? Есть причина, по которой у нас есть стандартный ввод .

Я бы все же предпочел

cin >> a1 >> b1 >> a2 >> b2;

Вместо того, чтобы доставлять пользователю трудные времена:

output1

output2

output3

output4

...