Practice.c
#include <stdio.h>
main()
{
char a;
printf("\nEnter Anything = ");
scanf("%c",&a); <Line 1>
printf("\n%d",a);
printf("\n%c",a);
}
Output 1 : Enter Character = 5
53
5
Output 2 : Enter Character = a
97
a
这个程序完全由本书执行。
New.c
#include <stdio.h>
main()
{
char a;
printf("\nEnter Character = ");
scanf("%d",&a); <Line 1>
printf("\n%d",a);
printf("\n%c",a);
}
Output 1 : Enter Character = 5
5
♣
Output 2 : Enter Character = a
0
这与Practice.c
的程序相同,只是稍作修改。这不是问题,但我错误地在程序%d
表示的行中键入%c
而不是Line 1
。我的这个错误产生了2个非常不同的输出。它背后的确切原因是什么?
答案 0 :(得分:2)
在ASCII 32
下面,所有都是不可打印的字符。在第二个代码中,您正在读取int
,然后尝试打印不可打印的等效字符。
对于第二个输入a
,scanf
不读取此字符并将其保留在缓冲区中,因为它需要整数而不是字符。变量a
未初始化,您现在正在访问未初始化的变量。这会调用未定义的行为。
答案 1 :(得分:1)
字符数据类型的大小为1个字节,而整数通常为4个字节。在这里,您尝试将字符变量读入整数。没有足够的存储空间来妥善处理这个问题。结果取决于您的体系结构是否支持小端或大端符号。
答案 2 :(得分:1)
当您使用%c
时,输入将被视为字符并存储其ASCII值。
使用%d
时,输入将被视为整数。
使用%c
进行打印时,会尝试以给定值打印ASCII char。
使用%d
进行打印时,会尝试打印该数字。
答案 3 :(得分:1)
您的新计划中发生的事情是
scanf("%d",&a);
读取时的格式说明符以整数%d给出,因此编译器将输入值假定为整数,即使它存储在char变量中,因此变量的值将为 a = 0x05,这是一个整数5
printf("\n%d",a);
打印变量a作为整数在输出上打印5
printf("\n%c",a);
我想你知道,当一个数字作为一个字符读取时(使用%c),它的ASCII值被存储(例如:scanf("%c",&a));
,你输入 a 为5 ,存储在变量 a 中的值是 a = 0x35(十六进制),或53作为整数表示
打印变量as character-&gt;因为0x05不是ASCII值中的字符或数字,所以它在输出上打印特殊字符
关于ASCII表的