You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:07:44