C - scanf 无符号字符

7

我正在尝试使用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);

1
你正在使用CodeBlocks或其他不支持'h'格式类型修饰符的编译器。只需将所有内容更改为'%u'并使用'unsigned int'即可。如果需要读取一个“byte”,请使用“char”。 - David C. Rankin
尝试在文件顶部添加#define __USE_MINGW_ANSI_STDIO 1,或者将-D__USE_MINGW_ANSI_STDIO=1添加到您的预处理器(或编译器)标志中。根据您提供的诊断输出,您似乎正在使用MinGW编译器。另请参阅此相关主题 - user539810
将-std=c99添加到编译器选项中?只是猜测。 - n. m.
@DavidC.Rankin Code::Blocks是一个集成开发环境(IDE),而不是编译器。它使用GCC作为编译器(如果我没记错的话)。 - Spikatrix
3
总的来说,在你的代码中,除非你需要读取一个字节,否则请使用本机类型intunsigned。这样会更快,因为编译器不需要从int转换为char等进行类型转换。如果你需要将读取限制为一个字节,请使用%c来表示字符。长度修饰符h很好用,但并不是所有编译器都实现了它。我以前就曾受到过这种问题的困扰。 - David C. Rankin
显示剩余3条评论
1个回答

1

这个问题的讨论可以在这里找到。 这是特定于MinGW的。
这里的评论中,该问题被确定为:

这很可能与bug https://sourceforge.net/p/mingw-w64/bugs/652/ 有关,因为包含顺序和编译器驱动实际上会影响C标准输出和格式说明符。

提出的解决方案是:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接