为何使用scanf读取unsigned char变量时首个值被设为0?
问题分析与解决方案
你遇到的问题核心是**scanf格式符和变量类型不匹配**导致的未定义行为。
问题根源
%u格式说明符在scanf中要求对应的参数是unsigned int*类型的指针,但你传入的是unsigned char*类型的指针(&in和&b的类型)。这种指针类型不匹配会触发C语言中的未定义行为,表现为第一个变量读取失败输出0,而第二个变量碰巧能正常读取(这只是未定义行为的一种随机表现,完全不能依赖)。
修正后的代码
有两种可行的修正方式:
方式一:使用正确的格式符读取unsigned char
对于unsigned char类型,应该使用%hhu格式符(C99及以后标准支持):
#include<stdio.h> int main(){ unsigned char in,b; scanf("%hhu %hhu",&in,&b); printf("%u %u\n",in,b); return 0; }
方式二:将变量类型改为unsigned int
如果不需要严格使用unsigned char,直接把变量类型换成unsigned int,这样%u格式符就完全匹配了:
#include<stdio.h> int main(){ unsigned int in,b; scanf("%u %u",&in,&b); printf("%u %u\n",in,b); return 0; }
补充说明
- 当你使用
printf输出unsigned char时,用%u是没问题的,因为变量会被隐式提升为unsigned int。 - 一定要保证
scanf的格式符和对应参数的指针类型严格匹配,否则未定义行为可能导致各种奇怪的问题,甚至程序崩溃。
内容的提问来源于stack exchange,提问作者markoj
相关产品推荐
相关产品推荐

