【发布时间】:2024-01-14 01:29:01
【问题描述】:
我尝试通过scanf 读取几个unsigned char 值,发现了一些奇怪的错误。在第二次调用scanf 期间,第一个unsigned char 变量被0 覆盖。但是写入scanf(" %hhu", &second); 将导致第二个unsigned char 变量被覆盖。
#include <stdio.h>
int main(void){
unsigned char first, second;
printf("Type first unsigned char variable: ");
scanf("%hhu", &first);
printf("first = %hhu\n", first);
printf("Type second unsigned char variable: ");
scanf("%hhu", &second);
printf("first = %hhu\n", first);
printf("second = %hhu\n", second);
return 0;
}
编译器详细信息:
gcc-core (gcc-5.1.0-tdm-1-core)
binutils (binutils-2.24-1-mingw32-bin)
mingwrt (mingwrt-3.20-2-mingw32-dev, mingwrt-3.20-2-mingw32-dll)
w32api (w32api-3.17-2-mingw32-dev)
附:使用%hu 或%u 没有区别。
【问题讨论】:
-
能否请您指定您使用的编译器版本以及您传递给它的参数,如优化级别等。
-
第二个很可能在地址中从第一个开始。所以 %hhu 可能被解释为 %hu。 hhu 是 C99 扩展,因此 j2ko 关于编译器版本的问题。
-
只是没有特殊输入的mingw gnu gcc编译器
-
MinGW 使用 Microsoft 库,而 Microsoft C 库可能仍然是 C90 而不是 C99 或更高版本,因此它可能无法正确处理
hh大小修饰符。 -
我可以确认微软的格式函数实现不能识别
%hhu,但我没有安装Windows,所以我无法测试。您可以尝试在second中写入 65535 并查看它是否为两个变量打印回 255。如果是这样,结论是您不能使用scanf(或其任何变体)在Windows 上读取unsigned char值。
标签: c windows scanf mingw unsigned-char