2014-10-28 20 views
12

我理解int16_tint32_t在C中的方式是它们在您的计算机上分别被键入16位和32位数字。我相信你会使用这些,当你需要保证一个数字是16或32位,因为不同的系统并不总是代表一个int 32位或short 16位(这个假设是否正确?我找到混合的答案,当我在网上)。如何使用int16_t或int32_t与scanf函数

我的问题是我怎么会用像scanf的功能从用户获取输入与int16_tint32_t或任何其他typedef操作数类型的,当我要求他们实际上是16位或32位或什么?是否有某种特殊的字符串修饰符?通常情况下,如果我想从用户的int,而无需关心它是如何大的其实是代表我会写这样的事情

scanf("%d", &int); 

如果我通过在int32_t,但这个工作我认为这仅仅是因为一个我的系统上的int是32位,它并没有专门给我一个32位数字,而只是给我一个int。如何获取保证为32位的数字?我看过this page of string modifiers和其他一些地方,但没有发现这些typedefed数字类型。

编辑:既然收到我的问题的答案,我已经做了一些谷歌搜索,发现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 
+1

为'int16_t'使用宏:'scanf函数( “%” SCNd16,与VAR)','为int32_t ':'scanf(“%”SCNd32,&var)'。 '#include ' – BLUEPIXY 2014-10-28 21:08:09

+4

@PaulGriffiths这很接近,但不是实际的重复。微妙的区别在于'printf'应该使用'PRI *'宏,而'scanf'应该使用'SCN *'宏。 – cpburnz 2014-10-28 21:12:37

+0

请注意,以上是针对avr-gcc(微控制器的gcc版本)。您平台的具体定义可能会有所不同。在Linux上,您可以在'/ usr/include/inttypes.h'中找到SCN ...宏。 – 2017-09-27 00:17:37

回答

16

对于那些需要从inttypes.hSCNd64SCNu32

scanf("%" SCNd32, &x);