uint8_t, uint16_t,…的格式说明符
Format specifiers for uint8_t, uint16_t, ...?
如果我有一个整数变量,我可以使用sscanf
,如下所示,使用格式说明符%d。
sscanf (line, "Value of integer: %dn", &my_integer);
哪里可以找到uint8_t
, uint16_t
, uint32_t
和uint64_t
的格式说明符?
uint64_t可能有%lu.
它们在<inttypes.h>
中声明为宏:SCNd8, SCNd16, SCNd32和SCNd64。示例(对于int32_t):
sscanf (line, "Value of integer: %" SCNd32 "n", &my_integer);
它们的格式是PRI(用于打印)/SCN(用于扫描),然后对应的说明符为0,u, x, x d, i,然后没有,LEAST, FAST, MAX,然后是大小(显然没有MAX的大小)。其他一些例子:PRIo8, PRIuMAX, SCNoFAST16.
编辑:顺便说一句,一个相关的问题问为什么使用这种方法。你会发现答案很有趣。正如其他人所说,包括定义格式宏的<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
根据ISO/IEC 9899:TC2的7.19.6格式化输入/输出函数,没有这样的格式说明符(所以我怀疑c++ 2003中是否有)。尽管在C99的inttypes.h
中有一些#define-宏,但cinttypes
和inttypes.h
并不是当前标准的一部分。当然,固定长度的整数类型也是非标准的。
无论如何,我强烈建议使用流来代替:
<any_type> x;
f >> x;
和完成。例如:
std::stringstream ss;
uint32_t u;
std::cin >> u;
这样做的好处是,在将来的某个时候,改变变量的类型不会导致一系列微妙的错误和未定义的行为。
在C语言中,报头为<inttypes.h>
,格式为SCNX8、SCNd16。
同样的头文件可能也适用于c++
读取uint64_t
(typedef unsigned long long int)的正确格式是,scanf
而不是sscanf
, "%" SCNu64
,打印也是SCNu64
的例子。在您的代码中,您读取例如my_integer变量,然后执行scanf ("Value of integer:%" SCNu64, & my_integer);
和写相同的,但使用printf.
您可以在<cstdint>
中检查c++的类型或在<types.h>
中检查C的类型。然后您可以指定当前在您的机器上编译的格式。如果变量是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
有关sscanf的使用,请参考此说明。
这些数据类型在stint .h中定义。参考这里的stint .h
优质棉细布
- 格式说明符C++有什么问题
- 0x%08lx 格式说明符在 printf 语句到 cout
- 在没有格式说明符的情况下在c++中使用类似printf的实用程序
- C++fmt库,只使用格式说明符格式化单个参数
- error_code的格式说明符是什么
- Visual Studio 是否正式支持 __int64 的 "%lld" 格式说明符?
- printf 格式说明符标志'0' %p,正确与否?
- 以下程序的格式说明符可能是什么?
- "%p 格式说明符的参数类型是 'void*'"是什么意思?
- %n格式说明符程序,在不同的编译器上提供不同的输出.为什么?
- Xcode 5 带有 %s 格式说明符的 LLVM printf 在调试控制台中不起作用
- SCANF 格式说明符仅读取数字
- 带有 C 格式说明符的不同输出
- 如何使用格式说明符创建字符串
- 将 %s 格式说明符与 boost::format 和 std::string 一起使用
- C/C++ 用于打印 0.0、1.0、0.025 的单格式说明符
- 在 C++ 中定义 Unicode 时的映射格式说明符
- 为什么我们不将格式说明符与 cout 一起使用?
- DWORD格式说明符
- 使用 printf 时矢量的格式说明符<Vec3b>