这个C程序输出奇怪

时间:2011-08-04 19:04:43

标签: c

#include<stdio.h>
main()
{
int i;
char c;
for (i=0;i<5;i++){
        scanf("%d",&c);
        printf("%d",i);
}
printf("\n");
}

我认为它会打印0 1 2 3 4,但事实并非如此。 奇怪的输出是什么原因?

5 个答案:

答案 0 :(得分:5)

Undefined Behaviour

您正在尝试将int(scanf调用中的"%d")读入char类型的对象(c)。不要那样做!

答案 1 :(得分:4)

此程序展示undefined behavior&c(char *)的类型与scanf arg的类型不对应(%d想要签名的int *)。

可能发生的事情是scanf将4个字节写入从c地址开始的内存位置。其中只有1个字节长,因此其他3个字节会覆盖i值的前3个字节。在小端系统上,这将有效地将i设置为您输入的任何整数值,右移8位。

但是,当然,这种行为是不确定的。下次编译此代码时,可以做一些完全不同的事情。不同的编译器或具有不同选项的相同编译器可以将i保留在寄存器中(其中scanf不能覆盖它)(但它可能会破坏堆栈上的返回地址,导致程序结束时崩溃) ,或者它可以以相反的顺序(相同的交易)将值放在堆栈上,或者它可以在堆栈上为c留下4个字节(不会导致意外行为),或者它可以检测到情况并中止错误,甚至可能make demons fly out of your nose

答案 2 :(得分:0)

您正在阅读c但正在打印i,因此您会看到01234.您可能需要打印c。但这还不够。 c应该被声明为int,因为你正在阅读格式为"%d"的文件,它需要一个int。使用格式hhd或更改c以输入int

答案 3 :(得分:-1)

scanf("%d",&c);

应该是

scanf("%c",&c);

顺便说一句。它将要求您在每次迭代中输入c的值,然后它将打印i的一个值。你有什么收获?

答案 4 :(得分:-1)

  

输出奇怪的原因是什么?

这是因为你没有正确使用scanf。当你使用“%d”时,你必须给scanf一个指向int的指针,但你给了它一个指向char的指针。

将您的char c更改为int c

(你还应该检查错误的函数。例如,scanf将在输入结束时返回EOF。它还将返回指定值的计数。由于你给它1个值&c,你应该检查一下scanf返回1.如果没有,可能发生了一些不好的事情)