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

Posted

技术标签:

【中文标题】从标准输入将原始类型的值读入变量【英文标题】:Reading values of primitive type in to variables from standard input 【发布时间】:2016-10-31 08:02:12 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

为什么 C++ 将 -4.23 拆分为整数部分和浮点部分,换句话说,为什么 .23 保留在输入流中以供后续流使用。

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

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

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

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

【讨论】:

【参考方案3】:
std::cin >> ia

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

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

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

【讨论】:

以上是关于从标准输入将原始类型的值读入变量的主要内容,如果未能解决你的问题,请参考以下文章

从标准输入将数字读入寄存器?加载 scanf 结果

go:读取标准输入

go:读取标准输入

第二章 从键盘或文件中获取标准输入:read命令

从管道将值读入 shell 变量

管道符重定向与环境变量