【问题标题】:C - scanf unsigned charC - scanf 无符号字符
【发布时间】:2016-04-10 15:47:53
【问题描述】:

我正在尝试使用scanf() 读取带有%hhu 的无符号字符值,但编译器返回给我:

error: unknown conversion type character 'h' in format
 [-Werror=format]| // line 3 error: too many arguments for format
 [-Werror=format-extra-args]| // line 3 

使用以下代码:

printf("Enter a number: ");
unsigned char nb;
scanf("%hhu", &nb); // line 3
printf("Number: %u\n", nb);
return (nb);

【问题讨论】:

  • 您正在使用代码块或其他不遵守h 格式类型修饰符的编译器。只需将所有内容更改为%u 并使用unsigned int。如果您需要阅读byte,请使用char
  • 尝试在文件顶部添加#define __USE_MINGW_ANSI_STDIO 1 或将-D__USE_MINGW_ANSI_STDIO=1 添加到您的预处理器(或编译器)标志。根据您提供的诊断输出,您似乎正在使用 MinGW 编译器。另见this related topic
  • 将 -std=c99 添加到编译器选项?只是猜测。
  • @DavidC.Rankin Code::Blocks 是 IDE,而不是编译器。它(IIRC)使用 GCC 作为编译器。
  • 作为一般说明,除非您需要读取 byte,否则请在代码中使用本机类型 intunsigned。它会更快,因为编译器不需要进行从intchar 的类型转换等。如果您需要将读取限制为一个字节,请使用%c for char。长度修饰符h 很好,但并非所有编译器都实现。我以前也被这个咬过。

标签: c scanf


【解决方案1】:

可以在here 找到有关此问题的讨论。 这是 MinGW 特有的。
来自this讨论中的评论,该问题被确定为:

这很可能与错误https://sourceforge.net/p/mingw-w64/bugs/652/ 有关,因为包含顺序和编译器驱动程序实际上在 C 标准输出和格式说明符方面搞砸了。

并且提出的解决方案是:

始终定义 __USE_MINGW_ANSI_STDIO 以便可以使用较新的 ansi 格式说明符,并确保(至少)不会在 MSVC 编译代码和 gcc 编译代码之间传递 long double。

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多