我有一个关于cin的问题 .
int main(void)
{
int a;
float b;
cin >> a >> b;
}
当我给出一个浮点数(例如3.14)作为输入时, a
和 b
都没有得到完整值(3.14):输出是a = 3,b = 0.14 .
我知道 cin
会按空格,制表符或Return分割输入,但'dot'不会,对吧?
为什么以下代码有效?
int main(void)
{
int i=0;
int k=0;
float j=0;
cin >> i >> k >> j; // i =3, j=k=0
}
还有一个问题,编译器会为我们带来什么好处呢?
谢谢!
4 回答
格式化的输入函数非常简单:
如果有的话,他们会跳过前导空格 .
他们尝试读取与给定类型匹配的格式 .
如果由于数据与所需格式不匹配而读取值失败,则会设置
std::ios_base::failbit
. 如果读取失败,则输入不应更改尝试读取的变量(标准输入操作符遵循此规则,但用户定义的输入操作符可能不会) .您尝试读取的第一个值是
int
. 读取int
意味着读取可选的前导符号后跟一系列数字(其中,根据您的设置和给定的值,流可以读取八进制或十六进制数而不是十进制数) . 也就是说,int
接收值3
并且读取停在.
前面 .根据您下一步阅读的内容,下一次阅读失败或不是:
在第一个代码中,您尝试读取浮点值,该值以可选符号开头,后跟可选的整数部分,后跟可选的千位分隔符,后跟可选的小数部分,后跟可选的指数 . 积分或分数部分至少需要一位数 . 在您的示例中,只有数千个单独的后跟小数部分 .
当尝试读取整数时,找到
.
,它不是int
的有效部分,并且读取失败 .尝试读取值后,应始终尝试读取操作是否成功并报告潜在错误:
请注意,在读取失败后,您可能还需要清理,例如,使用
这首先清除错误标志(没有这个,流将忽略任何进一步的读取数据的尝试),然后它忽略下一个字符 .
你已声明
a
的类型是int
,在这种情况下你对它有什么期望"."?另一个提到你工作得很好你问的问题是什么?你有
cin
ed 3变量你在这里期待什么? 0对float或int有效 .给定3.14的输入,点(句点)上的第一个解析因为点不适合整数的语法 . 第二个解析得到.14,解析得很好 .
输入3.14时会出现问题 . 第一个解析再次停在点上 . 第二个解析无法使用点重新启动,因此它将输入流标记为失败 .
执行I / O时始终检查状态 .
cin
正在读取输入"3.14"并要求将其放入整数然后浮点数 .所以
cin
开始读取,找到"3",然后找到".",这不是整数 . 将3存储到a
并继续 . ".14"是有效的浮点数,它将它放入b .然后你要求阅读
int
,int
,float
. 第二个整数不匹配且cin
停止,但它似乎只是起作用 . 实际上,它失败了 .编译器无法警告您正在执行无法正常工作的事情,因为输入在编译时是未知的 .