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

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

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

我在哪里可以finduint8_tuint16_tuint32_tuint64_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, cinttypesinttypes.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