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

Mat*_*ala 31 c++ input cin

你怎么检查用户是否没有在cin命令输入任何东西,只需按Enter键?

tem*_*def 44

std :: cin读取时,最好不要使用流提取操作符, >>因为这可能会产生各种令人讨厌的副作用.例如,如果您有此代码:

std::string name;
std::cin >> name;
Run Code Online (Sandbox Code Playgroud)

然后我输入John Doe,然后要读取的cin行将保留该值John,留下Doe将来通过某些未来的读操作来读取.同样,如果我写:

int myInteger;
std::cin >> myInteger;
Run Code Online (Sandbox Code Playgroud)

然后我输入John Doe,然后cin将进入错误状态,并且在您明确清除其错误状态并刷新导致错误的字符之前,将拒绝执行任何将来的读取操作.

进行用户输入的更好方法是使用std :: getline从键盘读取字符,直到用户输入为止.例如:

std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.
Run Code Online (Sandbox Code Playgroud)

ADL代表依赖于参数的查找.现在,如果我输入John Doe,那么值name将是,John Doe并且将不会有任何数据cin.此外,这还可以让您测试用户是否只是输入:

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

if (name.empty()) {
    /* ... nothing entered ... */
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法的缺点是,如果你想读取格式化的数据行,你int或者double你必须解析字符串中的表示.我个人认为这是值得的,因为如果用户输入无效的东西并且"防护" cin进入失败状态,它会让你更细粒度地控制该怎么做.

我教一门C++编程课程,并且有关于流库的一些讲义,这些讲述有关如何以cin安全的方式(主要在本章末尾)读取格式化数据的详细信息.我不确定你会发现这个有用,但是如果它有用,我想我会发布链接.

希望这可以帮助!