[英]Strange output of this C program
#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,但是没有。 输出奇怪的原因是什么?
未定义的行为 。
您正在尝试将int
(scanf调用中的"%d"
)读入char
类型( c
)的对象中。 不要那样做!
该程序表现出未定义的行为 : &c
(char *)的类型与scanf arg的类型不对应( %d
带符号的int *)。
可能发生的情况是scanf从c
的地址开始将4个字节写入内存位置。 它只有1个字节长,因此其他3个字节将覆盖i
值的前3个字节。 在little-endian系统上,这将有效地将i
设置为您输入的任何整数值,并右移8位。
但是,当然,行为是不确定的。 下次编译此代码时,它可能会做一些完全不同的事情。 不同的编译器或具有不同选项的同一编译器可以将i
保留在寄存器中(scanf无法覆盖该寄存器)(但它可能反而粉碎了堆栈上的返回地址,导致程序结束时崩溃),或者可能将值以相反的顺序(相同的方式)放在堆栈上,或者可以在堆栈上为c
保留4个字节(不会引起意外行为),或者它可以检测到情况并因错误中止,甚至可以恶魔飞出你的鼻子 。
您正在阅读c
但正在打印i
,因此您将看到01234。您可能打算打印c
。 但这还不够。 应该将c
声明为int,因为您正在读取格式为"%d"
格式,该格式期望为int。 使用格式hhd
或将c
更改为int类型
scanf("%d",&c);
应该
scanf("%c",&c);
顺便说一句 它将要求您在每次迭代中输入c的值,然后将打印i的一个值。 你得到什么?
输出奇怪的原因是什么?
这是因为您没有正确使用scanf。 使用“%d”时,必须给scanf指向一个整数的指针,但给它一个指向char的指针。
将您的char c
更改为int c
(您还应该检查函数是否有错误。例如,scanf将在输入结束时返回EOF。它还将返回分配值的计数。由于给定了1值&c
,因此应检查scanf返回1。不,可能发生了不好的事情)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.