2012-10-17 10 views
14

Czytanie this SO question, zacząłem się zastanawiać - jaki jest prawidłowy sposób korzystania z scanf/printf (i rodziny) z ustalonymi typami rozmiarów?Prawidłowy sposób korzystania z scanf/printf (i rodziny) o stałych rozmiarach?

Na przykład, jeśli mam short int lub int, użyłbym odpowiednio %hd i %d - dobrze.

Ale co, jeśli mam int16_t? short int może być inny niż int16_t, zależy od platformy. To samo dotyczy innych typów o stałym rozmiarze (całkowitym)?


UWAGA: Jak wygląda dostałam kilka dół głosów, bo „nie próbował google to”, wygląda na to muszę wyjaśnić: Nie zobacz podobne pytanie tutaj, dlatego je opublikowałem. Większość pytań w SO można było odpowiedzieć za pomocą Google, zamiast pytać tutaj. To spowodowałoby, że StackOverflow nie byłby tym miejscem, że tak naprawdę jest teraz.

I NIE, nie zrobiłem tego dla reputacji - już dziś osiągnąłem dzienny pułap reputacji (mając 24 głosy na samym szczycie przed opublikowaniem tego pytania).

Chodzi mi o to - nie sądzę, że zasługuje to na głosowanie w dół.

+1

Nie zapomnij użyć swojej dobrej znajomej google. ;) Dało to hit przy wyszukiwaniu: ["printf int16_t"] (https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=printf+int16_t&oq=printf+int16_t&gs_l=hp.3. ..741.1861.0.2073.8.7.0.0.0.0.267.267.2-1.1.0.les% 3B..0.0 ... 1c.1.7MPX56CVufA & pbx = 1 & bav = on.2, or.r_gc.r_pw.r_cp.r_qf. & fp = ec63c9d2be74365f & bpcl = 35277026 & biw = 1343 & bih = 748). – Mike

+0

@Mike - Nie mam :) Myślę, że dobrze byłoby mieć podobne pytanie tutaj (i nie, nie ze względu na reputację - już dziś trafiam na dzienny slogan reputacyjny (mając aż 24 przegranych do dziś)). Nie sądzę, że zasługuje to na głosowanie w dół. –

+0

+1 Uzgodniono z twoją zmianą. Dzięki za wytłumaczenie. – Mike

Odpowiedz

13

Prawidłowe sposobem jest użycie inttypes.h który określa standardowe makra printf rodziny i rodziny scanf, np

printf ("%" PRId16, short_int); 
scanf ("%" SCNd16, &short_int); 
+0

Fajnie, dzięki :) +1 i przyjęty. –

+0

Dlaczego to jest lepsze niż '% d'? Czyżby krótki nie został przekształcony w "int"? –

4

Plik nagłówkowy inttypes.h zawiera makra definiujące poprawne specyfikatory formatu dla liczb całkowitych o stałej szerokości zdefiniowane w pliku stdint.h. Na przykład specyfikatorem typu dla printf() i int16_t jest makro o nazwie PRId16. Przykład:

int16_t x; 
scanf("%" SCNd16, &x); 

printf("You have entered: %" PRId16 "\n", x); 
+1

Makra nie zawierają wymaganego wiodącego znaku '%'. –

+0

@ Steve-o naprawione. –

Powiązane problemy