2010-12-18 4 views
10

Lors de l'utilisation de scanf() et de ses variantes, le spécificateur de format %i acceptera les données comme hex (préfixe "0x"), octal (préfixe "0") ou décimal (pas de préfixe), par exemple les chaînes "0x10" , "020" et "16" sont tous convertis en un nombre entier avec la valeur décimale 16.Est-ce que `std :: istream :: operator >>()` peut accepter les préfixes radix entiers comme le spécificateur de format% i de stdio?

Est-ce que cela peut être fait avec std::istream::operator>> entrée formatée?

Utilisation simple >> i sans i/manipulateur o « 0x10 » est convertie à zéro (la partie « x10 » ou plutôt le 0 est, non traitée), et « 020 » à 20. hex, oct et dec manipulateurs se comportent comme %x, %o et %d respectivement. Je suis à la recherche d'un manipulateur général d'entrée qui fonctionne comme %i. Il est intéressant de noter que le manipulateur hex accepte à la fois "0x10" et "10" de convertir soit 16 décimales. Si vous vous demandez peut-être, j'implémente un évaluateur d'expression, et j'aimerais que les opérandes entiers soient hexadécimaux, octaux ou décimaux en utilisant la convention de préfixes C/C++. La mise en œuvre actuelle en utilisant sscanf() le fait automatiquement en utilisant %i, et je suis curieux de savoir si cela pourrait être modifié pour utiliser iostream sans avoir à analyser explicitement le format numérique.

+0

interestin. +1 Je me demande si le livre C++ IOStreams and Locales a ce genre de choses ... –

+0

Puisque je suis proche de 100%, il n'y a pas d'équivalent direct, je crois que la solution la plus simple et la plus efficace serait d'implémenter un nouveau manipulateur de la forme 'std :: ios_base & integer (std :: ios_base & str);' – Clifford

+0

@Johannes a la réponse, qui fournit également les moyens d'implémenter le manipulateur ci-dessus. – Clifford

Répondre

10

Le champ de base dans les indicateurs de format de basic_istream indique comment interpréter les nombres. Le champ peut être défini sur dec, oct et hex. Par défaut, il est défini sur dec. S'il est réglé sur aucun d'entre eux, basic_istream se comportera comme %i drapeau de scanf:

// automatically detect the base, depending on prefix 
std::cin.unsetf(std::ios_base::basefield); 
+0

Génie. Maintenant, je vois comment c'est fait, il est beaucoup plus facile de trouver la documentation qui vous dit comment! par exemple: http://stdcxx.apache.org/doc/stdlibug/28-3.html – Clifford

Questions connexes