C语言scanf用%d读入字符型变量,通过输入字符的ASCII码输入字符

有时候需要通过输入字符的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格式读入字符型变量有风险,可能会覆盖其他数据,造成程序运行异常。

相关推荐
Yu_Lijing3 分钟前
【个人项目】C++基于websocket的多用户网页五子棋(上)
开发语言·c++·websocket
脏脏a4 分钟前
【初阶数据结构】栈与队列:定义、核心操作与代码解析
c语言·开发语言
济宁雪人4 分钟前
Java安全基础——序列化/反序列化
java·开发语言
q***01775 分钟前
Java进阶--IO流
java·开发语言
lsx2024066 分钟前
C语言中的枚举(enum)
开发语言
Ayanami_Reii9 分钟前
进阶数据结构应用-一个简单的整数问题2(Fenwick-Tree 解法)
数据结构·算法·前缀和·差分·树状数组·fenwick tree
老黄编程10 分钟前
点云生成深度图的原理及算法步骤和参数详细说明
数学·算法·点云·深度图
csbysj202011 分钟前
PHP Math
开发语言
小画家~12 分钟前
第三十四:golang 原生 pgsql 对应操作
android·开发语言·golang
老黄编程14 分钟前
点云SIFT3D特征点云原理、算法描述及参数详细说明
算法·3d·sift3d