Самый распространенный / идиотостойкий способ отловить неверный ввод

Я вхожу в c ++ прямо сейчас, и сейчас я хочу знать наиболее распространенный / лучший способ отловить неверный ввод. Я хотел бы получить ответы на этот широко открытый вопрос, но мой более конкретный вопрос заключается в следующем.

Я хочу чар от пользователя. Если char равен ‘y’, он будет повторяться, если он равен ‘n’, программа закроется. Если я введу несколько символов, это будет повторяться столько раз, сколько символов, например Я ввожу «привет», он покажет мой вывод 5 раз. Я предполагаю, что он читает каждый символ и проходит через весь цикл, а затем читает следующий символ в строке. Как я могу заставить его появляться только один раз?

bool valid = 0;
while(valid)
{

...

bool secValid = 0;
while(secValid == 0)
{
cout << "To enter another taxable income type 'y': \n\n";
char repeat = NULL;
cin >> repeat;
if(repeat == 'y')
{
valid = 0;
secValid = 0;
system("cls");
}else if(repeat == 'n')
{
return;
}else
{
secValid = 1;
}
}
}

1

Решение

std::getline():

std::string line;
std::getline(std::cin, line);
if (line == "y") {
// handle yes
}
else if (line == "n") {
// handle no
}
else {
// handle invalid input
}
2

Другие решения

Вы можете структурировать это примерно так:

while(true) {
cout << "Repeat (y/n)? ";
string line;
if(!getline(cin, line))
break; // stream closed or other read error
if(line == "y") {
continue;
} else if(line == "n") {
break;
} else {
cout << "Invalid input." << endl;
}
}

Пример сеанса:

Repeat (y/n)? y
Repeat (y/n)? foo
Invalid input.
Repeat (y/n)? n

Здесь мы используем std::getline чтобы получить целую строку ввода, вместо того, чтобы получать по одному символу за раз.

3

использование std::getline от <string> заголовок, чтобы прочитать линия ввода в std::string

2

Также при проверке строки на «y» или «n» рекомендуется использовать вместо нее строку в верхнем регистре. Например

std::string YES = "Y";
std::string NO = "N";
...
std::string line;
std::getline(std::cin, line);
std::transform(line.begin(), line.end(), line.begin(), std::toupper);
if (line == YES)
{
...
}
else if (line == NO)
{
..

.
}

2
По вопросам рекламы [email protected]