使用scanf为unsigned char变量赋值时首变量始终为0的问题
unsigned char变量scanf赋值异常的原因分析
核心问题
你遇到的是Windows平台下GCC 9.2.0版本中,标准库对scanf的%hhu格式符实现存在缺陷。
具体细节
- C99标准规定,
%hhu格式符用于读取输入值到unsigned char类型变量,对应的参数必须是unsigned char*类型指针。但在该版本的Windows GCC环境中,scanf处理%hhu时,没有正确识别unsigned char*指针的类型,导致写入内存的位置错误,最终第一个unsigned char变量始终被写入0。 - 而
unsigned short搭配%hu能正常运行,是因为该版本标准库对%hu格式符的实现是正确的,能正确匹配unsigned short*指针完成赋值。 - 从你提供的单独调用两次
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.
相关产品推荐
相关产品推荐

