C ++示例:无法理解正在做什么?

时间:2013-04-26 10:27:55

标签: c++

我在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()

任何人都可以帮忙吗? 感谢

4 个答案:

答案 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。然后会发生两件事:

  1. 如果以某种方式失败(可能是用户输入字符而不是整数),则会设置失败位。这意味着std::cin >> age的结果将转换为bool false!会将其反转为true。因此,因为第一个和第二个条件都是真的,while循环的主体将执行,告诉用户他们输入了无效值,循环将再次循环。

  2. 如果输入成功,std::cin >> age的结果将为true!会将其转为false。这意味着while循环的主体将不会执行,也不会告诉用户他们输入的值不正确。

  3. 现在让我们来看看:

    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()函数,这基本上意味着预先忽略每个换行符。