unsigned short int 的格式说明符是什么?

问题描述 投票:0回答:5

我有以下程序

#include <stdio.h>

int main(void)
{
    unsigned short int length = 10; 

    printf("Enter length : ");
    scanf("%u", &length);

    printf("value is %u \n", length);

    return 0;
}

使用

gcc filename.c
编译时发出以下警告(在
scanf()
行)。

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

然后我参考了

C99 specification - 7.19.6 Formatted input/output functions
,并且在使用长度修饰符(如
short
long
等)和
unsigned
用于
int
数据类型时无法理解正确的格式说明符。

%u
是正确的说明符
unsigned short int
吗?如果是这样,为什么我会收到上述警告?!

编辑: 大多数时候,我在尝试

%uh
,它仍然在发出警告。

c scanf
5个回答
188
投票

尝试使用

"%h"
修饰符:

scanf("%hu", &length);
        ^

ISO/IEC 9899:201x - 7.21.6.1-7

指定以下 d 、 i 、 o 、 u 、 x 、 X 或 n 转换 说明符适用于类型为 pointer to short 或 无符号短.


59
投票

对于

scanf
,您需要使用
%hu
,因为您要将指针传递给
unsigned short
。对于
printf
,由于默认提升,不可能通过
unsigned short
(它将提升为
int
unsigned int
,具体取决于
int
是否具有至少与
unsigned short
一样多的值位)所以
%d
%u
都可以。不过,如果您愿意,您可以自由使用
%hu


11
投票

来自 Linux 手册页:

h 下面的整数转换对应于一个 short int 或 unsigned short int 参数,或者一个 fol-
       lowing n 转换对应于指向 short int 参数的指针。

所以要打印一个无符号短整数,格式字符串应该是

"%hu"
.


7
投票

这是一个good table for

printf
specifiers。所以对于
%hu
应该是
unsigned short int

链接到维基百科“C数据类型”也是。


0
投票

对于

printf
,由于默认提升(它将被提升为 int 或 unsigned int 取决于 int 是否具有至少与 unsigned short 一样多的值位)所以 unsigned short 是不可能的,所以
%d
 %u
很好。

但他仍然可以将这个

short int
的值更改为 0 和 1 的数组和(带有指针),然后使用另一个循环创建一个
short int
值并打印出来我猜。

让我们这样做:

struct byte3data {
    char a;
    char b;
    char c;
};
void my_printf(byte3data myOwnType) {
    // Writing 3 bytes with printf() in the way we want
}

printf
只是基本工具,这就是我认为应该如何对待它。您可以以任何您想要的方式管理位。对于浮点运算,您可以说是或否,但也可以说多少。试着把句子中的
printf
改成
printf
s,再想一想。

© www.soinside.com 2019 - 2024. All rights reserved.