1

我现在正在学习 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;
        }
    }
}
4

4 回答 4

3

你可以像这样构造它:

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获取一整行输入,而不是一次获取一个字符。

于 2012-10-24T05:29:31.680 回答
2

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
}
于 2012-10-24T05:30:36.840 回答
2

使用std::getlinefrom <string>header 将一行输入读入std::string

于 2012-10-24T05:31:36.037 回答
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)
{
    ..

. }

于 2012-10-24T05:57:17.383 回答