从标准输入中读取原始类型的值到变量中

时间:2016-06-28 20:21:12

标签: c++ inputstream

假设我有以下变量定义,我尝试从标准输入读取值。

int ia = 3;
double da = 0;

std::cin >> ia >> da;

现在,我在标准输入-4.23 -5.01

中键入以下值

如果我现在打印iada,则da为.23,ia为-4。

为什么C ++将-4.23分成整数组件和浮点组件,换句话说为什么.23留在输入流中用于后续读取?不会将-4.23简单地截断为-4然后读入ia

现在是一个不同的场景,假设我有与上面相同的代码,但这次我输入数字.23到标准输入流(只是控制台)ia存储0 (好吧这似乎遵循上面的行为)但是这次da包含0?在这种情况下似乎0.23被截断并以0读入,而.23没有像上面那样读入da

我无法理解在这些情况下应该发生什么。这里发生了两件不同的事情。

3 个答案:

答案 0 :(得分:1)

  

为什么C ++将-4.23分成整数分量和浮点分量,换句话说为什么.23保留在后续流的输入流中。

你告诉流输入将包含一个整数和一个double,并且在将输入解析为你指定的内容时它做得最好。

该流开始阅读int,阅读-4,意识到当它看到一个点.时,它无法在读取数字时取得进一步进展,并停在此处。之后你告诉C ++读一个双。它看到.23后跟一个空格,并将其解释为完全合法的double值。

  

假设我有与上面相同的代码,但这次我在标准输入流(只是控制台)中输入数字.23 ia存储0(好吧这似乎遵循以上行为)但是这次da包含0

这是因为当您要求输入整数时,流无法合法地将任何内容解析为ia。这会使流进入错误状态,这意味着在错误标志被重置之前不能再进行输入。

答案 1 :(得分:1)

std::cin >> ia

跳过任何空格字符。然后,它尝试从int中提取std::cin。如果找到一个不能用作int一部分的字符,它就会停止。

在您的情况下,.之后的-4不能用作int的一部分。因此,提取在那里停止。之后.23 -5.01仍留在流中。

然后踢出>> da部分。由于.23是有效的double,因此会被提取并存储在da中。提取在空白处停止。之后,-5.01仍留在输入流中。

答案 2 :(得分:0)

易。你告诉代码输入一个十进制值,它确实如此。 '。'在-4.23中不是整数,所以它停止并为整数分配“-4”。

流指针位于“.23”,这是一个有效的double个数字;所以它将所有空间分配给变量。所以你的double变量包含“.23”。

尝试更改变量,使它们属于同一类型或更改输入数据,以便第一项是整数。