Les spécificateurs de Format pour u_int8_t, uint16_t, ...?
Si j'ai une variable de type entier je peux utiliser sscanf
comme indiqué ci-dessous en utilisant le spécificateur de format %d.
sscanf (line, "Value of integer: %d\n", &my_integer);
Où puis-je trouver les spécificateurs de format pour uint8_t
, uint16_t
, uint32_t
et uint64_t
?
un uint64_t a probablement %lu.
- N'est-ce pas
%lu
pourunsigned long
? C'est souvent à 32 bits. - Pas de problème si vous utilisez iostreams au lieu de cela, qui s'adaptent au type de
- attention, pour 64 bits de cibles, Windows 64
unsigned long
est de 32 bits, alors que tous les UNIX et Linux 64 bitsunsigned long
sont 64 bits. - Trosset
unsigned long
n'est PAS 64 bits sur 64 bits variantes d'UNIX. Il est 32 bits sur 64 bits solaris à l'aide de gcc. Une fois, j'ai eu une expérience douloureuse d'apprentissage que c'est 64bits sur linux. - À partir de ce qui est expliqué là: unix.org/version2/whatsnew/lp64_wp.html, 64 bits solaris doit être une exception à UNIX être LP64.
Vous devez vous connecter pour publier un commentaire.
Ils sont déclarés dans
<inttypes.h>
que les macros: SCNd8, SCNd16, SCNd32 et SCNd64.Exemple (pour int32_t):
Leur format est PRI (pour printf)/SCN (pour analyse), o, u, x, X d, i pour l'correspondant spécificateur puis plus rien, du MOINS, RAPIDE, MAX, puis la taille (il n'y a évidemment pas de taille pour MAX). Quelques autres exemples: PRIo8, PRIuMAX, SCNoFAST16.
Edit: BTW un une question relative à la demandé pourquoi cette méthode a été utilisée. Vous pouvez trouver les réponses intéressantes.
SCNu32
pouruint32_t
.SCNi32
est pourint32_t
.<inttypes.h>
est présent, dans la seconde, en supposant que l'importation de<inttypes.h>
en même temps que<stdint.h>
est un pari assez sûr pour la mise en œuvre, je le sais.'\n'
dans unscanf()
format.Comme les autres ont dit, comprennent
<stdint.h>
en-tête définit le format des macros. En C++, cependant, de définir__STDC_FORMAT_MACROS
avant de l'inclure. De stdint.h:Selon 7.19.6 Formaté fonctions entrée/sortie de ISO/IEC 9899:TC2, il n'y a pas de formatage (donc je doute qu'il y tout pour le C++2003). Même si il ya des #define-macros disponibles dans la C99 de
inttypes.h
,cinttypes
etinttypes.h
ne font pas partie de la norme actuelle. Bien sûr, de taille fixe les types d'entiers non standard ainsi.De toute façon, j'ai sérieusement recommemend à l'aide de flux à la place:
et à faire. E. g.:
Ceci a l'avantage qu'une fois dans l'avenir, de changer le type de la variable ne doit pas entraîner une cascade de bogues subtils et comportement indéfini.
<<
, puissscanf
comme une alternative àfscanf
.En C, l'en-tête est
<inttypes.h>
, et des formats tels que SCNX8, SCNd16.Le même en-tête fonctionne probablement pour le C++ aussi.
<inttypes.h>
a été importé dans la norme C++ en même temps que<stdint.h>
(qui déclare le typedefint8_t
et amis), officiellement en C++0X, mais dans la pratique, disponible en tant qu'extension dans les implémentations d'avoir une relation forte avec une mise en œuvre de C99.Le bon format pour lire un
uint64_t
(typedef unsigned long long int) est, avecscanf
et passscanf
,"%" SCNu64
et pour l'impression est égalementSCNu64
Exemple. dans votre code, vous lisez par exemple my_integer variable, alors vous ne
scanf ("Value of integer:%" SCNu64, & my_integer);
et d'écrire la même chose mais avec printf.Reportez-vous à cette pour sscanf d'utilisation.
Ces types de données sont définis dans stdint.h. Reportez-vous ici pour stdint.h
Shash