捕获无效输入的最常见/最常见的方法

时间:2012-10-24 05:23:10

标签: c++ char cin

我现在正在进入c ++,现在我想知道捕获无效输入的最常见/最好的方法。我很想回答这个大问题,但我更具体的问题如下。

我想要一个来自用户的char。如果char为'y',那么它将重复,如果是'n'则程序将关闭。如果我输入多个字符,那么它将重复与字符数相同的次数,例如我输入'hello'它将显示我的输出5次。我假设它读取每个char并遍历整个循环然后读取下一个char。我怎样才能让它出现一次?

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 个答案:

答案 0 :(得分: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来获取整行输入,而不是一次获得一个字符。

答案 1 :(得分: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
}

答案 2 :(得分:2)

使用std::getline标题中的<string>输入到std::string

答案 3 :(得分:2)

同样,检查字符串“y”或“n”时,最好使用upcased字符串。例如

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)
{
    ..

。 }