#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,但事实并非如此。 奇怪的输出是什么原因?
答案 0 :(得分:5)
您正在尝试将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.如果没有,可能发生了一些不好的事情)