Puede `std :: :: istream operador >> ()` aceptar entero prefijos como Radix% i formato especificador de stdio?
Pregunta
Al usar scanf () y sus variantes, la %i
especificador de formato aceptará datos como hex (el prefijo "0x"), octal (con el prefijo "0"), o decimal (sin prefijo), así que por ejemplo las cadenas "0x10 ", "020", y "16" están todos convertidos a un número entero con valor decimal 16.
Se puede hacer esto con la entrada std::istream::operator>>
formato?
Uso >> i
llano sin i / o manipulador "0x10" se convierte en cero (o más bien el 0 Es decir, la parte "x10" no se procesa), y "020" a 20. El hex
, oct
y dec
manipuladores se comportan como %x
, %o
y %d
respectivamente. Busco a un manipulador de entrada entero en general que funciona como %i
.
Curiosamente quizás el manipulador hex
acepta tanto "0x10" y "10" de conversión o bien a 16 decimal.
En el caso puede que se pregunte, yo estoy poniendo en práctica un evaluador de expresiones, y me gustaría permitió número entero operandos ser hexadecimal, octal o decimal usando la C / C ++ prefijo convención. La implementación actual usando sscanf()
hace esto automáticamente %i
, y yo soy curioso en cuanto a si esto podría ser modificado para su uso iostream sin tener que analizar explícitamente el formato numérico.
Solución
El campo de base de los indicadores de formato de dictados basic_istream
cómo interpretar los números. El campo se puede establecer a dec
, oct
y para hex
. Por defecto se configura en dec
. Si se establece en ninguno de ellos, basic_istream
se comportará como bandera scanf
de %i
:
// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);
Otros consejos
En lugar de restablecer el basefield directamente, un poco más intuitivo
solución es utilizar la setbase(int base)
manipulador:
#include <iomanip>
#include <iostream>
int main()
{
int i;
std::cin >> std::setbase(0) >> i;
std::cout << i << std::endl;
}
Para citar cppreference:
Los valores de base distinta de 8, 10, o 16 restablecimiento basefield a cero, que corresponde a la salida decimal y el prefijo dependiente de entrada.