58 votes

Spécification de format pour uint8_t, uint16_t, ... ?

Si j'ai une variable entière, je peux utiliser sscanf comme indiqué ci-dessous en utilisant l'indicateur de format %d.

sscanf (line, "Value of integer: %d\n", &my_integer);

Où puis-je trouver les spécifications de format pour uint8_t , uint16_t , uint32_t y uint64_t ?

uint64_t a probablement %lu.

0 votes

N'est-ce pas ? %lu para unsigned long ? C'est souvent du 32 bits.

5 votes

Pas de problème si vous utilisez plutôt des iostreams, qui s'adaptent au type

1 votes

@MSalters : attention, pour les cibles 64 bits, Windows 64 unsigned long est de 32 bits, alors que tous les systèmes UNIX et Linux sont de 64 bits. unsigned long sont de 64 bits.

93voto

AProgrammer Points 31212

Ils sont déclarés dans <inttypes.h> comme des 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 (évidemment il n'y a 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 trouverez peut-être les réponses intéressantes.

4 votes

Il devrait être SCNu32 para uint32_t . SCNi32 est pour int32_t .

1 votes

-1 : Ils n'y sont pas déclarés, sauf en tant qu'extension non standard.

1 votes

@phresnel, une question sur les int8_t suppose évidemment soit C++0X, soit une extension qui les importe de C99 avant que la norme ne le fasse. Dans le premier cas, <inttypes.h> est présent, dans le second, en supposant l'importation de <inttypes.h> en même temps que <stdint.h> est un pari assez sûr pour la mise en œuvre que je connais.

7voto

Maxim Yegorushkin Points 29380

Comme d'autres l'ont dit, incluez <stdint.h> qui définit les macros de format. En C++, cependant, la définition de __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

4 votes

Et selon C++0X, "Les macros définies par <cinttypes> sont fournies sans condition. En particulier, le symbole __STDC_FORMAT_MACROS, mentionné dans la note de bas de page 182 de la norme C, ne joue aucun rôle en C++." Mais définir __STDC_FORMAT_MACROS peut aider les extensions non mises à jour pour suivre C++0X.

2voto

phresnel Points 20082

Según 7.19.6 Fonctions d'entrée/sortie formatées de ISO/IEC 9899:TC2 il n'existe pas de spécificateurs de format de ce type (je doute donc qu'il en existe pour C++2003). Même s'il y a des #define-macros disponibles dans le langage C99, il n'y a pas de spécificateurs de format. inttypes.h , cinttypes y inttypes.h ne font pas partie de la norme actuelle. Bien entendu, les types d'entiers de taille fixe ne sont pas non plus standardisés.

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 présente l'avantage qu'une fois dans le futur, le changement du type de la variable ne provoque pas une cascade de bogues subtils et de comportements indéfinis.

0 votes

L'utilisation de ">>" semble beaucoup plus lente que fscanf, 2-3 fois sur VC++ 2010.

1 votes

@sergtk : C'est une fonctionnalité. Par défaut, les iostreams sont synchronisés avec les fonctions C. Vous pouvez désactiver cela et le résultat sera que les iostreams sont au moins aussi rapides.

0 votes

Je suppose que vous voulez dire std::ifstream.sync_with_stdio(false) ; . Cela n'améliore pas raisonnablement la vitesse. De plus si la chaîne est lue par l'opérateur <<, puis analysée avec sscanf, alors la vitesse est presque la même qu'avec fscanf. Cela signifie que le parsing des valeurs est plus lent avec iostream et cela n'est pas lié à sync.

0voto

Jonathan Leffler Points 299946

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 le C++.

2 votes

<inttypes.h> a été importé dans le standard C++ en même temps que <stdint.h> (qui déclare le typedef int8_t et amis), formellement dans C++0X mais en pratique disponible comme extension dans les implémentations ayant une relation forte avec une implémentation de C99.

-2voto

Shash316 Points 1531

Se référer à este pour l'utilisation de sscanf.

Ces types de données sont définis dans stdint.h. Voir aquí pour stdint.h

Shash

0 votes

Se référer n'est pas répondre. Cela indique surtout que vous ne vous connaissez pas vous-même.

0 votes

Je ne crois pas au copier-coller si c'est disponible sur le net ! !! + C'est comme joindre les points, sscanf & stdint, vous ne pensez pas ?

2 votes

Mais les réponses de stackoverflow devraient rester valables en elles-mêmes. Dites au moins où à cplusplus.com/reference/clibrary/cstdio/sscanf il est mentionné comment formater int64 et al.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X