有时候需要通过输入字符的ascii码来输入字符,存于字符型变量,于是这样写代码:
cpp
#include <stdio.h>
int main(){
char c;
scanf("%d",&c);
printf("%c\n",c);
return 0;
}
程序运行正确:
但是,再多读一个字符:
cpp
#include <stdio.h>
int main(){
char c1,c2;
scanf("%d",&c1);
scanf("%d",&c2);
printf("c1=%c\tc2=%c\n",c1,c2);
return 0;
}
程序运行就不对了,c1中读入的字符莫名其妙消失了
再试验一下:
cpp
#include <stdio.h>
int main(){
char c1='1',c2='2',c3='3',c4='4',c5='5',c6;
scanf("%d",&c6);
printf("c1=%c\tc2=%c\tc3=%c\tc4=%c\tc5=%c\tc6=%c\n",c1,c2,c3,c4,c5,c6);
return 0;
}
可以看出,c3,c4,c5的值消失了。
原因是:
正确的做法是:将ascii码读进一个整型变量t中,再赋值给字符型变量,期间有隐形类型转换,去掉了多出来的3个字节。
cpp
#include <stdio.h>
int main(){
char c1='1',c2='2',c3='3',c4='4',c5='5',c6;
int t;
scanf("%d",&t);
c6=t;
printf("c1=%c\tc2=%c\tc3=%c\tc4=%c\tc5=%c\tc6=%c\n",c1,c2,c3,c4,c5,c6);
return 0;
}
可以看出,程序运行正确。
提醒:用scanf用%d格式读入字符型变量有风险,可能会覆盖其他数据,造成程序运行异常。