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

相关推荐
l1t2 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
再见晴天*_*3 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
l1t4 小时前
利用美团龙猫用libxml2编写XML转CSV文件C程序
xml·c语言·libxml2·解析器
lqjun08274 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge6 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘6 小时前
39.网络流入门
开发语言·网络·c++·算法
未来之窗软件服务7 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
西红柿维生素7 小时前
JVM相关总结
java·jvm·算法
小冯记录编程7 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio
1uther7 小时前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎