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

相关推荐
無限進步D3 小时前
Java 运行原理
java·开发语言·入门
是苏浙3 小时前
JDK17新增特性
java·开发语言
阿里加多6 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood7 小时前
java中`==`和`.equals()`区别
java·开发语言·python
IronMurphy7 小时前
【算法三十九】994. 腐烂的橘子
算法
zs宝来了7 小时前
AQS详解
java·开发语言·jvm
Tomhex8 小时前
C语言内存安全防护指南
c语言
Ares-Wang8 小时前
算法》》旅行商问题 TSP、7座桥问题 哈密顿回路 深度优先 和 宽度优先
算法·深度优先·宽度优先
Liqiuyue8 小时前
Transformer:现代AI革命背后的核心模型
人工智能·算法·机器学习
WolfGang0073218 小时前
代码随想录算法训练营 Day34 | 动态规划 part07
算法·动态规划