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

使用scanf为unsigned char变量赋值时首变量始终为0的问题

unsigned char变量scanf赋值异常的原因分析

核心问题

你遇到的是Windows平台下GCC 9.2.0版本中,标准库对scanf的%hhu格式符实现存在缺陷。

具体细节

  1. C99标准规定,%hhu格式符用于读取输入值到unsigned char类型变量,对应的参数必须是unsigned char*类型指针。但在该版本的Windows GCC环境中,scanf处理%hhu时,没有正确识别unsigned char*指针的类型,导致写入内存的位置错误,最终第一个unsigned char变量始终被写入0。
  2. 而unsigned short搭配%hu能正常运行,是因为该版本标准库对%hu格式符的实现是正确的,能正确匹配unsigned short*指针完成赋值。
  3. 从你提供的单独调用两次scanf的示例也能看出,问题并非输入分隔或单次调用的偶然情况,而是%hhu格式符与unsigned char*指针的匹配处理存在系统性bug。

临时解决办法

可以通过临时变量中转的方式规避这个问题:

#include <stdio.h>
int main(void)
{
    unsigned char a, b;
    unsigned int temp_a, temp_b;
    int res = scanf("%u %u", &temp_a, &temp_b);
    a = (unsigned char)temp_a;
    b = (unsigned char)temp_b;
    printf("res = %d, a = %hhu, b = %hhu\n", res, a, b);
    return 0;
}

这样通过unsigned int接收输入再强制转换,就能绕过%hhu的实现缺陷,正确完成赋值。

内容的提问来源于stack exchange,提问作者Liliia D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:12:44