uint8_t,uint16_t,...的格式说明符?

时间:2011-08-09 08:05:02

标签: c++ c++11 scanf

如果我有一个整数变量,我可以使用sscanf,如下所示,使用格式说明符%d。

sscanf (line, "Value of integer: %d\n", &my_integer);

我在哪里可以找到uint8_tuint16_tuint32_tuint64_t的格式说明符?

uint64_t可能有%lu。

7 个答案:

答案 0 :(得分:84)

它们在<inttypes.h>中声明为宏:SCNd8,SCNd16,SCNd32和SCNd64。 示例(对于int32_t):

sscanf (line, "Value of integer: %" SCNd32 "\n", &my_integer);

他们的格式是PRI(对于printf)/ SCN(对于扫描)然后o,u,x,X d,i对应的说明符然后没有,LEAST,FAST,MAX那么大小(显然没有大小) MAX)。其他一些例子:PRIo8,PRIuMAX,SCNoFAST16。

编辑:BTW related question询问为何使用该方法。您可能会发现答案很有趣。

答案 1 :(得分:7)

正如其他人所说,包含定义格式宏的<stdint.h>标头。但是,在C ++中,在包含它之前定义__STDC_FORMAT_MACROS。来自stdint.h:

/* The ISO C99 standard specifies that these macros must only be
   defined if explicitly requested.  */
#if !defined __cplusplus || defined __STDC_FORMAT_MACROS

答案 2 :(得分:2)

根据 ISO / IEC 9899:TC2 7.19.6格式化输入/输出函数,没有这样的格式说明符(所以我怀疑是否有C + 2003)。即使C99的inttypes.h中有一些#define-macros,cinttypesinttypes.h也不属于当前标准。当然,固定大小的整数类型也是非标准的。

无论如何,我认真推荐使用流来代替:

<any_type> x;
f >> x;

完成。 E.g:

std::stringstream ss;
uint32_t u;
std::cin >> u;

这样做的好处是,将来的一次,更改变量的类型不会导致一连串微妙的错误和未定义的行为。

答案 3 :(得分:0)

在C中,标题为<inttypes.h>,格式如SCNX8,SCNd16。

相同的标题也可能适用于C ++。

答案 4 :(得分:0)

读取uint64_t(typedef unsigned long long int)的正确格式是,scanf而非sscanf"%" SCNu64,而且打印也是{{1 }} 例。在您的代码中,您阅读了例如my_integer变量,然后就可以了 SCNu64并使用printf编写相同内容。

答案 5 :(得分:0)

对于C ++,您可以在<cstdint>中检查类型,对于C,您可以检查<types.h>中的类型。然后,您可以指定计算机上当前编译的格式。 如果变量是unsigned,则需要使用%u;如果变量是signed,则需要使用%d。对于小于32个字节的变量,您不必指定长前缀。

在我的配置中,我有64位程序,因此我的uint64_t被编译为unsigned long long int,因此意味着要使用%llu。如果您的程序将以32位编译,则可以使用%lu,因为uint64_t将被编译为unsigned long int

但是谁还在使用x86? :),因此通常:

uint8_t, uint16_t, uint32_t - %u
uint64_t - %llu
int8_t, int16_t, int32_t - %d
int64_t -%lld

答案 6 :(得分:-1)

有关sscanf的使用,请参阅this

这些数据类型在stdint.h中定义。请参阅here了解stdint.h

词shash