c++ 如何“安全地”使用带有字符的cin

2fjabf4q  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(118)

这似乎是一个愚蠢的问题,但我找不到太多关于这方面的信息。
我的代码接受用户输入,并且只期望接收't''f'
我很难“保护”程序不受边缘情况的影响(例如:如果输入包含多个字符和/或空格,则它将遍历缓冲区中的每个char,直到找到't''f')。
我知道使用cin.fail()只适用于int。有没有类似的东西可以用于char?我希望类似的东西可以起作用。我只是很难弄清楚如何定义cin的错误/失败,以及如何阻止它在整个缓冲区中循环。

char choice = '0';
while(choice != 't' && choice != 'f') {
    std::cout << "Is this answer true or false? (t/f) ";
    std::cin >> choice;
    
    if (error_with_input) {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Error. char not entered. Please try again";
    }
}

我是否从错误的Angular 看待这个问题?我是否应该将choice变量设置为string而不是char?然后我可以使用getline(),测试choice的长度是否为1,如果是,那么最后测试choice是否是't''f'。这似乎有点低效,但也许这是个更好的解决办法

zfciruhq

zfciruhq1#

将输入读取为std::string,或者至少读取为char[],是正确的方法。在读取输入后验证输入,而不是在读取时验证输入,例如:

string choice;
do {
    std::cout << "Is this answer true or false? (t/f) ";
    std::cin >> choice;
    
    if (choice != "t" && choice != "f") {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Error. char not entered. Please try again";
    }
    else {
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        break;
    }
}
while (true);

相关问题