【问题标题】:Why scanf overrides previously readed unsigned char variables with 0?为什么 scanf 用 0 覆盖以前读取的 unsigned char 变量?
【发布时间】: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-dl​​l)

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


【解决方案1】:

您似乎有一个旧的、有缺陷的 MinGW 版本。

您可以改为使用mingw-w64。该项目被分叉的部分原因是原始项目不愿意修复这样的错误,更愿意责怪其他方。

使用该编译器后,使用-D__USE_MINGW_ANSI_STDIO 编译器开关来获得一致模式(不幸的是,它仍然默认为 Microsoft 兼容模式)。

【讨论】:

    最近更新 更多