while(cout << "Enter a positive integer: " &&
(!(cin >> anInteger) || anInteger < 0))
{
cout << "Enter a positive integer.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
while(cout << "Read or write (r/w): " &&
(!(cin >> rw) || (rw != 'r' && rw != 'w')))
{
cout << "Enter r or w.\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
这里我要求输入一个整数,后跟“r”或“w”。但是,当在第一个 while 语句中输入类似“4r”的内容时,“r”保留在缓冲区中并应用于下一个 while 语句。我该如何解决这个问题?
只有在第一个 while 循环中输入的是所有整数而不是截断字符时,最简单的方法是什么?
最佳答案
您可以只ignore()
整数后一行的内容:当读取整数时,读取在第一个不适合整数的字符处停止,即不会读取以下换行符.
考虑到您在多个地方忽略字符直到行尾,创建并使用操纵器来执行此操作可能是合理的:
std::istream& igln(std::istream& in) {
return in.ignore(std::numeric_limits<std::streamsize>::max());
}
...
while (std::cout << "Read or write (r/w): "
&& (!(std::cin>> igln >> rw) || (rw != 'r' && rw != 'w')) {
std::cout << "Enter r or w!\n";
if (std::cin.eof()) {
throw std::runtime_error("reached end of stream\n");
}
std::cin.clear();
}
请注意,循环总是忽略该行的其余部分,因此在循环内不需要它。
关于c++ - cin 缓冲区没有被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025687/