如何在使用scanf等函数时使用int16_t或int32_t?

28

在C语言中,我理解int16_tint32_t是typedef定义的,分别代表计算机上的16位和32位数字。当不同系统的intshort并非总是表示为32位或16位时,您可能会使用它们来确保数字为16位或32位(这种假设正确吗?当我在网上搜索时,得到了不同的答案)。

我的问题是:如果我需要实际为16位或32位等typedef数字类型的输入,我该如何使用诸如scanf之类的函数从用户那里获取输入?是否有某种特殊的字符串修饰符?通常,如果我只需要从用户那里获取一个int而不关心它实际上被表示为多大,我会写出以下代码:

scanf("%d", &int);
如果我传入一个 int32_t ,这个方法就能工作,但我认为这只是因为我的系统上的 int 是32位,而它并没有明确给我一个32位的数字,而只是给了我一个 int 。我应该如何获取保证为32位的数字?我已经在这个字符串修饰符页面和其他一些地方搜索过,但没有找到关于这些typedefed数字类型的提及。 编辑:自从得到了这个问题的答案之后,我查找了一些资料,并在 这里 找到了参考资料。
uppercase hexadecimal printf format for uintptr_t

#define SCNd16   "d"
decimal scanf format for int16_t

#define SCNd32   "ld"
decimal scanf format for int32_t

#define SCNd8   "hhd"
decimal scanf format for int8_t

#define SCNdFAST16   "d"
decimal scanf format for int_fast16_t

#define SCNdFAST32   "ld"
decimal scanf format for int_fast32_t

#define SCNdFAST8   "hhd"
decimal scanf format for int_fast8_t

#define SCNdLEAST16   "d"
decimal scanf format for int_least16_t

#define SCNdLEAST32   "ld"
decimal scanf format for int_least32_t

#define SCNdLEAST8   "hhd"
decimal scanf format for int_least8_t

#define SCNdPTR   SCNd16
decimal scanf format for intptr_t

#define SCNi16   "i"
generic-integer scanf format for int16_t

#define SCNi32   "li"
generic-integer scanf format for int32_t

#define SCNi8   "hhi"
generic-integer scanf format for int8_t

#define SCNiFAST16   "i"
generic-integer scanf format for int_fast16_t

#define SCNiFAST32   "li"
generic-integer scanf format for int_fast32_t

#define SCNiFAST8   "hhi"
generic-integer scanf format for int_fast8_t

#define SCNiLEAST16   "i"
generic-integer scanf format for int_least16_t

#define SCNiLEAST32   "li"
generic-integer scanf format for int_least32_t

#define SCNiLEAST8   "hhi"
generic-integer scanf format for int_least8_t

#define SCNiPTR   SCNi16
generic-integer scanf format for intptr_t

#define SCNo16   "o"
octal scanf format for uint16_t

#define SCNo32   "lo"
octal scanf format for uint32_t

#define SCNo8   "hho"
octal scanf format for uint8_t

#define SCNoFAST16   "o"
octal scanf format for uint_fast16_t

#define SCNoFAST32   "lo"
octal scanf format for uint_fast32_t

#define SCNoFAST8   "hho"
octal scanf format for uint_fast8_t

#define SCNoLEAST16   "o"
octal scanf format for uint_least16_t

#define SCNoLEAST32   "lo"
octal scanf format for uint_least32_t

#define SCNoLEAST8   "hho"
octal scanf format for uint_least8_t

#define SCNoPTR   SCNo16
octal scanf format for uintptr_t

#define SCNu16   "u"
decimal scanf format for uint16_t

#define SCNu32   "lu"
decimal scanf format for uint32_t

#define SCNu8   "hhu"
decimal scanf format for uint8_t

#define SCNuFAST16   "u"
decimal scanf format for uint_fast16_t

#define SCNuFAST32   "lu"
decimal scanf format for uint_fast32_t

#define SCNuFAST8   "hhu"
decimal scanf format for uint_fast8_t

#define SCNuLEAST16   "u"
decimal scanf format for uint_least16_t

#define SCNuLEAST32   "lu"
decimal scanf format for uint_least32_t

#define SCNuLEAST8   "hhu"
decimal scanf format for uint_least8_t

#define SCNuPTR   SCNu16
decimal scanf format for uintptr_t

#define SCNx16   "x"
hexadecimal scanf format for uint16_t

#define SCNx32   "lx"
hexadecimal scanf format for uint32_t

#define SCNx8   "hhx"
hexadecimal scanf format for uint8_t

#define SCNxFAST16   "x"
hexadecimal scanf format for uint_fast16_t

#define SCNxFAST32   "lx"
hexadecimal scanf format for uint_fast32_t

#define SCNxFAST8   "hhx"
hexadecimal scanf format for uint_fast8_t

#define SCNxLEAST16   "x"
hexadecimal scanf format for uint_least16_t

#define SCNxLEAST32   "lx"
hexadecimal scanf format for uint_least32_t

#define SCNxLEAST8   "hhx"
hexadecimal scanf format for uint_least8_t

#define SCNxPTR   SCNx16
hexadecimal scanf format for uintptr_t

1
对于 int16_tscanf("%" SCNd16 , &var),对于 int32_tscanf("%" SCNd32 , &var)#include <inttypes.h> - BLUEPIXY
7
@PaulGriffiths 这很接近,但不是完全重复。微小的区别在于printf 应使用 PRI* 宏,而 scanf 应使用 SCN* 宏。 - Uyghur Lives Matter
请注意,上述内容适用于avr-gcc,这是针对微控制器的gcc版本。您的平台的特定定义可能会有所不同。在Linux上,您可以在/usr/include/inttypes.h中找到SCN...宏。 - Kevin Chen
&int是什么意思? - Radzor
1个回答

28

如果需要使用inttypes.h中的宏,例如SCNd64SCNu32等,请使用它们。

scanf("%" SCNd32, &x);

这是C99标准的一部分吗? - nowox
@nowox 是的,它是。https://port70.net/~nsz/c/c99/n1256.html#7.26.4(c99草案) - gizlu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接