Итак, вы хотите, чтобы пользователь вводил эти 4 целые числа следующим образом:
-10 0
30 40
И вы хотите отклонить все другие форматы ввода ...
Другими словами, ввод должен включать:
4 int
целые числа
2 ' '
пробелы
2 '\n'
новые строки
Вы можете изменить лог c Я собираюсь обсудить настройку этих параметров по мере необходимости .
Это больше похоже на задачу решения проблемы. В любом случае, поскольку вы по какой-то причине не хотите использовать getline
, вам придется самостоятельно управлять большей частью обработки ввода.
Вот мое мнение по этому поводу:
Считайте вводимый символ (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;
}
Прежде чем продолжить, вам понадобится функция, например bool isInt(string num)
, чтобы проверить, работает ли заданная строка является целым числом или нет . Вы можете сделать его самостоятельно в соответствии с вашими потребностями. У Stackoverflow уже есть поток по этому поводу: Как определить, является ли строка числом с помощью C ++? Функция должна возвращать true, только если строка может быть помещена в int
.
Затем вы можете проверить вводимые пользователем данные на наличие скрытых драгоценных камней, не входных данных или спама:
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;
}
После завершения проверки вы можете извлечь и отобразить ваши целые числа (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...";
}
Собираем все вместе: Live Demo
И Я не совсем уверен, нужно ли вам ограничение на пробелы, но вы можете изменить logi c, чтобы удалить все вхождения spaceCount
и при необходимости изменить условие чтения l oop на while (newlineCount != 2)
.
Итак, вы действительно хотели все усложнить? Есть причина, по которой у нас есть стандартный ввод .
Я бы все же предпочел
cin >> a1 >> b1 >> a2 >> b2;
Вместо того, чтобы доставлять пользователю трудные времена:
![output1](https://i.stack.imgur.com/ufi10.png)
![output2](https://i.stack.imgur.com/n4KHG.png)
![output3](https://i.stack.imgur.com/644TE.png)
![output4](https://i.stack.imgur.com/WkYcz.png)