Puede `std :: :: istream operador >> ()` aceptar entero prefijos como Radix% i formato especificador de stdio?

StackOverflow https://stackoverflow.com/questions/4476804

  •  11-10-2019
  •  | 
  •  

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top