2014-10-28 8 views
12

Die Art und Weise, die ich int16_t oder int32_t in C verstehe, ist, dass sie typedefed zu 16 und 32-Bit-Nummern jeweils auf Ihrem Computer sind. Ich glaube, dass Sie diese verwenden würden, wenn Sie eine Zahl von 16 oder 32 Bits garantieren müssen, da verschiedene Systeme nicht immer eine int als 32 Bits oder short als 16 Bits darstellen (Ist diese Annahme richtig? Ich finde gemischte Antworten, wenn ich online schaue .).So verwenden Sie int16_t oder int32_t mit Funktionen wie scanf

Meine Frage ist, wie würde ich eine Funktion wie scanf zu bekommen Eingabe von einem Benutzer mit einem int16_t oder einem int32_t oder einer der anderen typedefed Nummerntypen verwenden, wenn ich verlangen, daß sie tatsächlich 16 Bit oder 32 Bit sein, oder was auch immer? Gibt es einen speziellen String Modifier? Normalerweise, wenn ich ein int von einem Benutzer ohne die Sorge um, wie groß es ist tatsächlich dargestellt bekommen wollte, wie ich so etwas wie diese

scanf("%d", &int); 

Dies funktioniert, wenn ich in einem int32_t passieren schreiben würde, aber ich nehme an, es ist nur, weil ein int auf meinem System ist 32 Bit und es gibt mir nicht speziell eine 32-Bit-Nummer, sondern gibt mir nur eine int. Wie würde ich eine Zahl erreichen, die garantiert 32 Bit beträgt? Ich habe auf this page of string modifiers und ein paar andere Orte geschaut, aber habe keine Erwähnung dieser typedefed Nummerntypen gefunden.

Bearbeiten: Seit Erhalt einer Antwort auf meine Frage habe ich etwas Googeln und gefunden this. Ich habe es unten auch als Referenz eingefügt.

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

für 'int16_t' verwenden müssen:' scanf ("%" SCNd16 & var) ',' für int32_t ':' scanf ("%" SCNd32, & var) '. '#include ' – BLUEPIXY

+4

@PaulGriffiths Dies ist nahe, aber kein tatsächliches Duplikat. Der feine Unterschied ist, dass 'printf' die' PRI * '- Makros verwenden sollte, während' scanf' 'SCN *' - Makros verwenden soll. – cpburnz

+0

Beachten Sie, dass das oben für avr-gcc, eine Version von gcc für Mikrocontroller ist. Die spezifischen Definitionen für Ihre Plattform werden wahrscheinlich unterschiedlich sein. Unter Linux finden Sie die SCN ... -Makros in '/ usr/include/inttypes.h'. –

Antwort

16

Für diejenigen, die Makros aus inttypes.h wie SCNd64 oder SCNu32 usw.

scanf("%" SCNd32, &x);