web-dev-qa-db-ja.com

uint8_t、uint16_t、...のフォーマット指定子

整数変数がある場合、書式指定子%dを使用して、以下に示すようにsscanfを使用できます。

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

uint8_tuint16_tuint32_t、およびuint64_tのフォーマット指定子はどこにありますか?

uint64_tにはおそらく%luがあります。

53
Usman

これらは、<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。

編集:ところで 関連する質問 その方法が使用された理由を尋ねました。答えが面白いと思うかもしれません。

84
AProgrammer

他の人が言ったように、<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
7

7.19.6 Formatted input/output functions of ISO/IEC 9899:TC2によると、そのような形式指定子はありません(C++ 2003には疑わしい) 。 C99のinttypes.hで使用できる#define-macrosがいくつかありますが、cinttypesおよびinttypes.hは現在の標準の一部ではありません。もちろん、固定サイズの整数型も非標準です。

とにかく、代わりにストリームを使用して真剣にお勧めします:

<any_type> x;
f >> x;

そして行われます。例えば。:

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

これには、将来一度変数の型を変更しても、微妙なバグや未定義の動作のカスケードが発生しないという利点があります。

2
Sebastian Mach

Cでは、ヘッダーは<inttypes.h>、およびSCNX8、SCNd16などの形式。

同じヘッダーがおそらくC++でも機能します。

0

uint64_t(typedef unsigned long long int)を読み取るための正しい形式は、scanfではなくsscanfで、"%" SCNu64であり、印刷の場合もSCNu64です。コードでは、たとえばmy_integer変数を読み取り、scanf ("Value of integer:%" SCNu64, & my_integer);を実行し、printfを使用して同じことを記述します。

0
Alejandro Caro