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

相关推荐
hsjiasb20 分钟前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
丰锋ff1 小时前
3.1 Qt事件之事件处理器
开发语言·qt
多弗朗皮卡丘1 小时前
C语言梦开始的地方7:函数
c语言·开发语言
月华路2 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
gugucoding2 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
m0_380743872 小时前
从零调用 Claude 教程
开发语言·python·node.js
起床学FPGA3 小时前
AI回答问题之后,会自动跳到最下面的问题
开发语言·javascript·ecmascript
罗西的思考3 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
x_x-F4 小时前
网络数据从网卡到用户态:一场基于内存所有权转移的接力赛
开发语言·网络·php
民乐团扒谱机4 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化