繁体   English   中英

这个C程序的奇怪输出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM