将原始类型的值从标准输入读入变量

Reading values of primitive type in to variables from standard input

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

int ia = 3;
double da = 0;

std::cin >> ia >> da;

现在我在标准输入中输入以下值,-4.23 -5.01

如果我现在打印 iadada 是 .23 而 ia 是 -4。

为什么 C++ 将 -4.23 拆分为整数部分和浮点部分,换句话说,为什么 .23 保留在输入流中以供后续读取? -4.23 不会简单地被截断为 -4 然后读入 ia 吗?

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

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

简单。您告诉代码输入一个十进制值,它做到了。这 '。' in -4.23 不是整数,因此它停止并将“-4”分配给整数。

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

尝试更改变量以使它们具有相同类型或更改输入数据以使第一项为整数。

Why did C++ split -4.23 in to integer component and floating point component, in other words why did .23 remain in the input stream for subsequent streams.

你告诉流输入将包含一个整数和一个双精度数,并且它尽力将输入解析为你指定的内容。

流开始读取一个 int,读取 -4,当它看到一个点 . 时,意识到它无法继续读取数字,并就此停止。之后,您告诉 C++ 读取一个双精度值。它看到 .23 后跟 space,并将其解释为完全合法的 double 值。

suppose I have the same piece of code as above but this time I enter the number .23 in to the standard input stream (which is just the console) ia stores 0 (OK this seems to follow the above behavior) but then da contains 0 this time

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

std::cin >> ia

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

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

然后进入 >> da 部分。由于 .23 是一个有效的 double,它被提取并存储在 da 中。提取在空白处停止。在那之后,-5.01 仍然留在输入流中。