C++:如何检查 cin 缓冲区是否为空?

标签 c++ input cin

如何检查用户是否没有在 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 Doename 的值将是 John Doe,并且 中不会留下任何数据>cin。此外,这还可以让您测试用户是否只是按 Enter 键:

std::string name;
getline(std::cin, name);

if (name.empty()) {
    /* ... nothing entered ... */
}

使用这种方法的缺点是,如果您想读取格式化的数据行、intdouble,则必须将表示解析出来的字符串。我个人认为这是值得的,因为它可以让您更细粒度地控制如果用户输入无效的内容并“保护” cin 不会进入失败状态。

我教授一门 C++ 编程类(class),并且拥有 some lecture notes about the streams library详细介绍了如何以安全的方式从 cin 读取格式化数据(主要在本章末尾)。我不确定你会发现它有多大用处,但如果它有帮助,我想我会发布链接。

希望这会有所帮助!

关于C++:如何检查 cin 缓冲区是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999650/

相关文章:

c++ - Win32 - 确定路径是否有可用的巨型图标

parsing - Haskell:如何将 IO 输入字符串解析为 Float(或 Int 或其他)?

c++ - std::cin 适用于少量行,但不适用于较大行

c++ - 有没有办法让 C++ 从 cin 中接收未定义数量的字符串?

C++ 错误 : Use of deleted function in move constructor

c++ - C++中线程的简单示例

c++ - Qt:lupdate 正在将撇号转换为 '

html - CSS/HTML 代码无效,字体未应用

值更改时的 HTML 输入

c++ - Cin 跳过输入整数