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安全的方式(主要在本章末尾)读取格式化数据的详细信息.我不确定你会发现这个有用,但是如果它有用,我想我会发布链接.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
60824 次 |
| 最近记录: |