乱码的原因是这样的,int字长四个字节,但是scanf("%c",得到的是变量a的地址,而且它认为这个地址是指向一个char的,于是它就只填充了一个char而已,后面三个字节是什么它根本就不管了。于是如果后面的三个字节非零的话,显示的当然不是65啦。
解决方法有两个。一个是先给int赋初值,这个楼上已经给出代码了。第二个是完全把int当作char使用。如下:
#include <stdio.h>
int main(void)
{
int a;
scanf("%c", &a);
printf("%c\n", a); // 此处因为%c只关心a的前一个字节的内容,所以无关紧要
printf("%d\n", (char)a); // 将a强制转换为char,忽略掉后三个字节
printf("%d\n", a & 0xFF); // 显式地忽略掉a的后三个字节
return 0;
}