如何检查用户是否没有在 cin 命令中输入任何内容而只是按了回车键?
最佳答案
从 std::cin 读取时,最好不要使用 stream extraction operator >>
因为这会产生各种讨厌的副作用。例如,如果您有以下代码:
std::string name;
std::cin >> name;
然后我输入 John Doe
,然后从 cin
读取的行将只保存值 John
,留下 Doe
后面被一些 future 的读取操作读取。同样,如果我要写:
int myInteger;
std::cin >> myInteger;
然后我输入 John Doe
,然后 cin
将进入错误状态并拒绝执行任何 future 的读取操作,直到您明确清除其错误状态并刷新导致错误的字符。
进行用户输入的更好方法是使用 std::getline从键盘读取字符,直到用户按下回车键。例如:
std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.
ADL代表依赖于参数的查找。现在,如果我输入 John Doe
,name
的值将是 John Doe
,并且 中不会留下任何数据>cin
。此外,这还可以让您测试用户是否只是按 Enter 键:
std::string name;
getline(std::cin, name);
if (name.empty()) {
/* ... nothing entered ... */
}
使用这种方法的缺点是,如果您想读取格式化的数据行、int
或 double
,则必须将表示解析出来的字符串。我个人认为这是值得的,因为它可以让您更细粒度地控制如果用户输入无效的内容并“保护” cin
不会进入失败状态。
我教授一门 C++ 编程类(class),并且拥有 some lecture notes about the streams library详细介绍了如何以安全的方式从 cin
读取格式化数据(主要在本章末尾)。我不确定你会发现它有多大用处,但如果它有帮助,我想我会发布链接。
希望这会有所帮助!
关于C++:如何检查 cin 缓冲区是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999650/