uint8_t,uint16_t,…的格式说明符?
如果我有一个整数variables,我可以使用sscanf
,如下所示使用格式说明符%d。
sscanf (line, "Value of integer: %d\n", &my_integer);
我在哪里可以finduint8_t
, uint16_t
, uint32_t
和uint64_t
格式说明符?
uint64_t可能有%lu。
它们在<inttypes.h>
中声明为macros:SCNd8,SCNd16,SCNd32和SCNd64。 示例(对于int32_t):
sscanf (line, "Value of integer: %" SCNd32 "\n", &my_integer);
它们的格式是PRI(用于printf)/ SCN(用于扫描),然后是o,u,x,X d,i代表相应的指定符,然后是最小值,最大值,最大值,最大值,然后是大小(显然MAX没有大小)。 其他一些例子:PRIo8,PRIuMAX,SCNoFAST16。
编辑:顺便说一句相关的问题,问为什么这个方法被使用。 你可能会发现有趣的答案。
正如其他人所说,包括<stdint.h>
标题,它定义了macros的格式。 然而,在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
根据ISO / IEC 9899:TC2的 7.19.6格式化input/输出函数 ,没有这样的格式说明符(所以我对C ++ 2003有任何疑问)。 即使在C99的inttypes.h
有一些#definemacros, cinttypes
和inttypes.h
也不是当前标准的一部分。 当然,固定大小的整数types也是非标准的。
无论如何,我认真地推荐使用stream代替:
<any_type> x; f >> x;
并做好。 例如:
std::stringstream ss; uint32_t u; std::cin >> u;
这样做的好处是,将来有一次,改变variables的types不会引起级联的细微的错误和未定义的行为。
在C中,头是<inttypes.h>
,格式如SCNX8,SCNd16。
相同的头文件也可能适用于C ++。
读取uint64_t
(typedef unsigned long long int)的正确格式是,用scanf
而不是sscanf
, "%" SCNu64
和print也是SCNu64
例子。 在你的代码中,你读了例如my_integervariables,然后你做scanf ("Value of integer:%" SCNu64, & my_integer);
并写入相同的,但与printf。
请参考这个 sscanf用法。
这些数据types在stdint.h中定义。 请参阅stdint.h
词shash