gpt4 book ai didi

c - scanf 的意外行为

转载 作者:行者123 更新时间:2023-11-30 14:57:35 24 4
gpt4 key购买 nike

我想将两个整数作为输入并输出它们的和。当给出两个整数作为输入时,代码可以正常工作。但是,当我给出一个非整数值作为第一个值的输入(例如 2.3)并按 Enter 键时,程序不会等待第二个输入并产生奇怪的输出。

您能告诉我为什么会发生这种情况吗?

#include <stdio.h>

int main()
{
int a, b;
scanf(" %d%d", &a, &b);

int c = a +b;
printf("%d\n", c);

return 0;
}

最佳答案

给定输入 2.3,格式字符中的空格会导致跳过任何空格(没有),并且第一个 %d 会导致值 2 来读取。下一个要读取的字符将是 .,并将保留在缓冲区中。 scanf(),在处理第二个%d时会遇到'.',认为该字符不是整数值的一部分,并且终止读取,再次将 '.' 留在要读取的流中。

因此,scanf("%d%d", &a, &b) 的最终效果是将 2 读取到 a,并且b 没有变化。

除非您的代码执行某些操作来读取 '.'(例如使用 %c 格式读取它),否则 . 将继续位于流中,并且 %d 的每次使用都会以同样的方式失败。

您的代码不会检查 scanf() 的返回值,但如果检查了,则会检测到问题的另一个后果。 scanf() 的返回值为 1,表示已成功读取一个值 (a)。如果整数ab都已成功读取,则将返回值2

由于 bmain() 中未初始化,访问其值会产生未定义的行为,而 scanf() 不会改变这一事实。未定义行为的一种可能后果是您看到的“奇怪的输出”。

关于c - scanf 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43844785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com