我在http://www.parashift.com/c++-faq-lite/istream-and-ignore.html
找到了这个链接显示“如何让std :: cin跳过无效的输入字符?”
Use std::cin.clear() and std::cin.ignore().
#include <iostream>
#include <limits>
int main()
{
int age = 0;
while ((std::cout << "How old are you? ")
&& !(std::cin >> age)) {
std::cout << "That's not a number; ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cout << "You are " << age << " years old\n";
...
}
Of course you can also print the error message when the input is out of range. For example, if you wanted the age to be between 1 and 200, you could change the while loop to:
...
while ((std::cout << "How old are you? ")
&& (!(std::cin >> age) || age < 1 || age > 200)) {
std::cout << "That's not a number between 1 and 200; ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
...
Here's a sample run:
How old are you? foo
That's not a number between 1 and 200; How old are you? bar
That's not a number between 1 and 200; How old are you? -3
That's not a number between 1 and 200; How old are you? 0
That's not a number between 1 and 200; How old are you? 201
That's not a number between 1 and 200; How old are you? 2
You are 2 years old
我无法理解它是怎么做的&gt;任何人都可以解释一下吗?
我怀疑:
while ((std::cout << "How old are you? ")
&& !(std::cin >> age))
如何检查有效条目?我的意思是问表达式“std :: cout&lt;&lt;”你多大了?“和”!(std :: cin&gt;&gt; age)“,返回true或false哪些是AND?
令人困惑的另一件事是使用,
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
有什么目的?在Google上搜索了这些功能,但我还不清楚。
特别是std::numeric_limits<std::streamsize>::max()
任何人都可以帮忙吗? 感谢
答案 0 :(得分:10)
流上的插入和提取运算符<<
和>>
将返回对流本身的引用。这就是为什么你可以像这样串起插入的原因:
std::cout << "Hello, " << "World!";
首先std::cout << "Hello, "
会返回对std::cout
的引用,然后您将等同于std::cout << "World!"
。
流也可以转换为bool
。这基本上检查流的状态是否仍然正常。什么都没有失败。例如,您可以这样做:
if (std::cin) // ...
这将检查std::cin
流是否仍处于良好状态。
现在让我们看看你问的代码:
while ((std::cout << "How old are you? ")
&& !(std::cin >> age))
插入std::cout
不会导致失败。它包含在这里的唯一原因是每次输入age
之前都会出现这种情况。另一种方法是在while
之前放置一次,在while
身体放置一次。
完成std::cout
的插入后,将评估!(std::cin >> age)
。这将首先让用户提供age
。然后会发生两件事:
如果以某种方式失败(可能是用户输入字符而不是整数),则会设置失败位。这意味着std::cin >> age
的结果将转换为bool
false
。 !
会将其反转为true
。因此,因为第一个和第二个条件都是真的,while
循环的主体将执行,告诉用户他们输入了无效值,循环将再次循环。
如果输入成功,std::cin >> age
的结果将为true
而!
会将其转为false
。这意味着while
循环的主体将不会执行,也不会告诉用户他们输入的值不正确。
现在让我们来看看:
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
这只发生在输入失败的上述情况1中。如果流进入故障状态,则在状态被清除之前,它将不再接受任何插入或提取。这就是clear()
的作用。然后,对ignore
的调用表示提取所有字符,直到并包括流中的下一个\n
并丢弃它们。这消除了流中的无效输入。
答案 1 :(得分:1)
while ((std::cout << "How old are you? ") && !(std::cin >> age))
cout
是类ostream
的全局对象,cin
是类istream
的全局对象
这些对象沿着重载的运算符<<
(在ostream
中定义)和>>
(在istream
中定义)来获取输入(通过调用为...定义的函数)这些经营者)
operator<<
的返回类型属于ostream&
类型,operator>>
的返回类型为istream&
。然后将它们转换为布尔值。见this。
同时检查cin.ignore()
cin.clear()
和{{1}}
答案 2 :(得分:0)
由于age
是一个整数
(std::cin >> age)
尝试解析输入以获取有效的整数,如果它可以返回true,否则返回false。
要了解cin.ignore
,它会......
从输入流中提取并丢弃字符,直到和 包括delim。
答案 3 :(得分:0)
std::numeric_limits
允许您获取适合给定类型的最大数量。
在您的示例中,它被传递给ignore()
函数,这基本上意味着预先忽略每个换行符。