ANSI C(ISO C90):scanf能读取/接受无符号字符吗?

16

简单的问题:在ANSI C中,scanf能否将"小整数"读入到无符号字符(unsigned char)中?

示例代码 un_char.c:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned char character;

    scanf("%hhu", &character);

    return EXIT_SUCCESS;
}

编译结果为:

$ gcc -Wall -ansi -pedantic -o un_char un_char.c
un_char.c: In function ‘main’:
un_char.c:8: warning: ISO C90 does not support the ‘hh’ gnu_scanf length modifier

hh 在 ISO C90 中不被支持。那么在这种情况下可以使用哪个 scanf 转换字符?


如果您的代码不需要在Windows上运行,请将“-ansi”更改为“-std=c99”。 - zwol
2个回答

12

不支持使用'%hhu'在C89(C90)中读取数字字符串到无符号字符中,这是C99的新特性。

您需要先将其读入无符号整数('%u')或无符号短整数('%hu'),然后检查结果是否在无符号字符范围内。


3

将其读入无符号短整数/整数中,如果需要进行范围检查,则在之后执行。


无符号短整型(unsigned short)将是更好的数据类型,因为它只有16位...只需去掉高8位即可.. :) - t0mm13b
1
@tommieb75:unsigned short 不一定保证是16位。同样,unsigned char 也不一定保证是8位。 - jamesdlin
@jamesdlin:我同意……由于不同的处理器/编译器/链接器/运行时环境…… :O :) - t0mm13b
@jamesdlin:我相信有一个保证,即char至少为8位,这已经足够了。 - Matt Joiner
@Matt Joiner:是的,但我的观点是你不能只是像 tommieb76 建议的那样去掉高8位,而应该像 nos 建议的那样进行范围检查。 - jamesdlin

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