【问题标题】:How to use int16_t or int32_t with functions like scanf [duplicate]如何将 int16_t 或 int32_t 与 scanf 等函数一起使用 [重复]
【发布时间】:2014-12-24 10:54:27
【问题描述】:

我在 C 中理解 int16_tint32_t 的方式是它们在您的计算机上分别被定义为 16 位和 32 位数字。我相信当您需要保证一个数字是 16 位或 32 位时您会使用这些,因为不同的系统并不总是将 int 表示为 32 位或将 short 表示为 16 位(这个假设是否正确?我发现混合的答案当我上网时。)。

我的问题是,当我要求它们实际上是 16 位或32位还是什么?是否有某种特殊的字符串修饰符?通常,如果我想从用户那里得到一个int,而不关心它的实际表示有多大,因为我会写这样的东西

scanf("%d", &int);

如果我传入int32_t,这将有效,但我认为这只是因为我的系统上的int 是32 位的,它没有专门给我一个32 位的数字,而是给我一个int .我将如何获得保证为 32 位的数字?我查看了this page of string modifiers 和其他一些地方,但没有发现这些类型定义的数字类型。

编辑:自从收到我的问题的答案后,我进行了一些谷歌搜索并找到了this。我也将其包含在下面以供参考。

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

【问题讨论】:

  • 对于int16_tscanf("%" SCNd16 , &var),对于int32_tscanf("%" SCNd32 , &var)#include <inttypes.h>
  • @PaulGriffiths 这很接近,但不是真正的副本。细微的差别是printf 应该使用PRI* 宏,而scanf 应该使用SCN* 宏。
  • 请注意,以上是针对 avr-gcc,微控制器的 gcc 版本。您的平台的具体定义可能会有所不同。在 Linux 上,您可以在 /usr/include/inttypes.h 中找到 SCN... 宏。

标签: c user-input scanf


【解决方案1】:

对于那些您需要使用来自inttypes.h 的宏,例如SCNd64SCNu32 等。

scanf("%" SCNd32, &x);

【讨论】:

  • 这是 C99 标准的一部分吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2011-12-01
  • 2019-10-10
  • 2013-10-02
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多