Si j'ai une variable entière, 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 des spécificateurs de format pour uint8_t
, uint16_t
, uint32_t
et uint64_t
?
uint64_t a probablement% lu.
Ils sont déclarés dans <inttypes.h>
en tant que macros: SCNd8, SCNd16, SCNd32 et SCNd64. Exemple (pour int32_t):
sscanf (line, "Value of integer: %" SCNd32 "\n", &my_integer);
Leur format est PRI (pour printf)/SCN (pour scan) puis o, u, x, X d, i pour le spécificateur correspondant puis rien, LEAST, FAST, MAX puis la taille ( il n'y a évidemment pas de taille pour MAX.) Quelques autres exemples: PRIo8, PRIuMAX, SCNoFAST16.
Edit: BTW a question connexe a demandé pourquoi cette méthode a été utilisée. Vous pouvez trouver les réponses intéressantes.
Comme d'autres l'ont dit, incluez <stdint.h>
en-tête qui définit les macros de format. En C++, cependant, définissez __STDC_FORMAT_MACROS
avant de l'inclure. De stdint.h:
/* The ISO C99 standard specifies that these macros must only be
defined if explicitly requested. */
#if !defined __cplusplus || defined __STDC_FORMAT_MACROS
Selon 7.19.6 Fonctions d'entrée/sortie formatées sur ISO/IEC 9899: TC2, il n'y a pas de tels spécificateurs de format (donc j'en doute pour C++ 2003) . Même s'il existe des # define-macros disponibles dans C99's inttypes.h
, cinttypes
et inttypes.h
ne fait pas partie de la norme actuelle. Bien sûr, les types entiers de taille fixe ne sont pas non plus standard.
Quoi qu'il en soit, je recommande sérieusement d'utiliser des flux à la place:
<any_type> x;
f >> x;
et être fait. Par exemple.:
std::stringstream ss;
uint32_t u;
std::cin >> u;
Cela a l'avantage qu'une fois dans le futur, changer le type de la variable ne provoquera pas une cascade de bogues subtils et un comportement indéfini.
En C, l'en-tête est <inttypes.h>
, et des formats tels que SCNX8, SCNd16.
Le même en-tête fonctionne probablement aussi pour C++.
Le bon format pour lire un uint64_t
(Typedef unsigned long long int) est, avec scanf
et non sscanf
, "%" SCNu64
Et pour l'impression est également SCNu64
Exemple. dans votre code vous lisez par exemple la variable my_integer, puis vous faites scanf ("Value of integer:%" SCNu64, & my_integer);
et écrivez la même chose mais avec printf.