2014-10-28 375 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);