多次涉及 "cin.fail()" 运行 的循环
loop involving "cin.fail()" running multiple times
我在使用以下代码时遇到问题。它意味着一直要求有效输入,直到输入整数或双精度数。它按预期用于字符,但是当我输入长度超过 1 的字符串时,它将 运行 循环多次。比如输入“hello”,原因是“Please enter a valid number”要打印5次。有趣的是,“h llo”只会打印句子 4 次。
int gamenumber;
while(true)
{
cin >> gamenumber;
if(cin.fail())
{
cout << "Please enter a valid number" << endl;
cin.clear();
cin.ignore();
} else
break;
我设法通过将“cin.ignore()”替换为“cin.ignore(1000, '\n')”来解决这个问题。
但不管怎样,我不明白为什么单独使用“cin.ignore()”不能解决这个问题,这让我很烦恼?有没有办法不使用“cin.ignore(1000, '\n')”来修复上面的代码? (这是家庭作业的一部分,我们可能不允许使用“cin.ignore(1000, '\n')”)
谢谢!
您需要将 ignore
与重载的一起使用,请参阅此答案 。
或者你可以只需要 运行 getline
到 drain 的内容,但是这种方式比较慢而且没有必要。
#include <iostream>
#include <string>
int main()
{
double n;
while( std::cout << "Please, enter a number\n"
&& ! (std::cin >> n) )
{
std::cin.clear();
std::string line;
std::getline(std::cin, line);
std::cout << "I am sorry, but '" << line << "' is not a number\n";
}
std::cout << "Thank you for entering the number " << n << '\n';
}
我在使用以下代码时遇到问题。它意味着一直要求有效输入,直到输入整数或双精度数。它按预期用于字符,但是当我输入长度超过 1 的字符串时,它将 运行 循环多次。比如输入“hello”,原因是“Please enter a valid number”要打印5次。有趣的是,“h llo”只会打印句子 4 次。
int gamenumber;
while(true)
{
cin >> gamenumber;
if(cin.fail())
{
cout << "Please enter a valid number" << endl;
cin.clear();
cin.ignore();
} else
break;
我设法通过将“cin.ignore()”替换为“cin.ignore(1000, '\n')”来解决这个问题。
但不管怎样,我不明白为什么单独使用“cin.ignore()”不能解决这个问题,这让我很烦恼?有没有办法不使用“cin.ignore(1000, '\n')”来修复上面的代码? (这是家庭作业的一部分,我们可能不允许使用“cin.ignore(1000, '\n')”)
谢谢!
您需要将 ignore
与重载的一起使用,请参阅此答案
或者你可以只需要 运行 getline
到 drain 的内容,但是这种方式比较慢而且没有必要。
#include <iostream>
#include <string>
int main()
{
double n;
while( std::cout << "Please, enter a number\n"
&& ! (std::cin >> n) )
{
std::cin.clear();
std::string line;
std::getline(std::cin, line);
std::cout << "I am sorry, but '" << line << "' is not a number\n";
}
std::cout << "Thank you for entering the number " << n << '\n';
}