Guía completa de conversión de cadenas y números en C ++

Existe una diferencia entre los números almacenados en forma de cadena y los números almacenados en forma digital.

Por ejemplo, la cadena "2679" no es un número: es una secuencia de 4 caracteres del código ASCII 2, 6, 7 y 9. Dado que la cadena "2679" no es un número, el compilador no le permitirá realizar operaciones matemáticas como suma, multiplicación y división. Una cadena representada por un número debe convertirse primero a una forma numérica antes de que pueda usarse con operadores aritméticos.

De manera similar, los valores del programa en forma digital, como int, long y double, a veces deben convertirse a forma de cadena, de modo que la cadena resultante se pueda enviar inmediatamente a un archivo u otros dispositivos de entrada y salida, o un carácter almacenado en la memoria. Objeto de cadena para uso posterior.

Cuando el usuario ingresa un número en el teclado, el número se ingresa en forma de una cadena, al igual que una serie de caracteres (números) ingresados ​​por el usuario. En  C ++  , estos números normalmente los lee el operador de extracción de flujo >>. Antes de almacenar en una variable numérica, el operador realizará automáticamente la conversión según sea necesario. Durante la salida, la conversión inversa de números a cadenas la realiza el operador de salida de flujo <<.

Utilice objetos de secuencia de cadenas para la conversión de números

C ++ tiene dos clases, ostringstream e istringstream, que se pueden usar para realizar conversiones de cadena / número en valores en la memoria.

La clase ostringstream es una subclase de ostream (cout también pertenece a esta clase) y usa el operador de inserción de flujo << para convertir valores numéricos en cadenas. El objeto de tipo ostringstream funciona de la misma manera que los objetos cout y file, pero en lugar de escribir datos en la pantalla o el archivo, escribe en el objeto string que contiene.

Cada vez que usa << en un objeto ostringstream, realiza la conversión necesaria de número a cadena y agrega el resultado al final de su cadena. Además de admitir todas las funciones miembro y los operadores de la clase ostream, el objeto ostringstream también admite las funciones miembro str que se muestran en la Tabla 1.

La clase istringstream se deriva de istream. Contiene un objeto de cadena en su interior y la función lo usa como un flujo de entrada que se puede "leer" de él.

El constructor isringstream puede establecer el flujo de entrada cuando se crea el objeto, o puede establecerse llamando a la función str (string s) después de que se crea el objeto. El operador de extracción de flujo >> lee de una cadena cerrada y convierte la cadena en un número si es necesario. La Tabla 1 enumera las funciones de los miembros de isringstream.Debe incluir sstream archivos de encabezado en el programa  para usar estas clases.
 

Tabla 1 Funciones de los miembros de las clases ostringstream e isringstream
Función miembro Representación
istringstream (cadena s) El constructor de istringstream: establece el valor inicial del flujo de entrada del objeto. Ejemplo:
istringstream istr ("50 64 28");
ostringstream (cadena s) Constructor de ostringstream: establece el valor inicial del flujo de salida del objeto. Ejemplo:
ostringstream ostr ("50 64 28");
cadena str () Devuelve la cadena contenida en el objeto ostringstream o isringstream. Ejemplo:
cadena es = istr.str ();
cadena os = ostr.str ();
void str (cadena & s) Establezca la cadena del flujo de entrada o salida como el objeto. Ejemplo:
ostr.str ("50 64 28");
istr.str ("50 64 28");


El siguiente programa demuestra el uso de estas clases:

 
  1. // Este programa ilustra el uso de objetos sstream
  2. #include <sstream>
  3. #include <iostream>
  4. #include <cadena>
  5. u sin g espacio de nombres std;
  6.  
  7. int main ()
  8. {
  9. string str = "Juan 20 50"; // cadena para leer
  10. const char * cstr = "Amy 30 42"; // Cstring para leer
  11. istringstream istr1 (cadena); // istr1 leerá de str
  12. istringstream istr2; // istr2 leerá de cstr
  13. ostringstream ostr; // El objeto ostringstream en el que escribir
  14. nombre de cadena;
  15. int score1, score2, average_score;
  16.  
  17. // Leer el nombre y las puntuaciones y calcular el promedio y luego escribir en ostr
  18. istr1 >> nombre >> puntuación1 >> puntuación2;
  19. average_score = (score1 + score2) / 2;
  20. ostr << name << "tiene una puntuación media" << average_score << "\ n";
  21. // Establecer istr2 para leer de la cadena C y repetir lo anterior
  22. istr2.str (cstr);
  23. istr2 >> nombre >> puntuación1 >> puntuación2;
  24. average_score = (score1 + score2) / 2;
  25. ostr << name << "tiene una puntuación media" << average_score << "\ n";
  26. // Cambiar a salida hexadeximal en ostr
  27. ostr << hex;
  28. // Escribe las puntuaciones de Amy en hexadecimal
  29. Las puntuaciones de ostr << name << "en hexadecimal son:" << score1 << "y" << score2 << "\ n";
  30. // Extrae la cadena de ostr e imprímela en la pantalla
  31. cout << ostr.str ();
  32. return 0;
  33. }

Salida del programa:

John tiene una puntuación media35
Amy tiene una puntuación media36
Las puntuaciones de Amy en hexadecimal son: 1e y 2a

Tenga en cuenta que estas clases tienen todas las funciones de los objetos ostream e istream, incluida la capacidad de convertir números en cadenas utilizando diferentes bases como octal y hexadecimal. Por supuesto, también tienen fallas: obligan a los programadores a crear objetos sstream para que puedan realizar conversiones utilizando sus operadores de inserción y extracción.

Función de conversión de números

C ++ 11 proporciona varias funciones to_string (valor T) para convertir el valor numérico del tipo T en forma de cadena. La siguiente es una lista de varias funciones to_string ():

cadena to_string (valor int)
cadena to_string (valor largo)
cadena to_string (valor doble)

Mira el siguiente ejemplo de código:

 
  1. int a = 5;
  2. cadena str = to_string (a * a);
  3. cout << "El cuadrado de 5 es" << str << endl;

El ejemplo anterior muestra el uso de esta serie de funciones. Imprimirá la siguiente cadena:

El cuadrado de 5 es 25

La función to_string () no puede manejar la conversión de enteros no decimales. Si necesita esta función, debe usar el objeto ostringsteam para completar la conversión.

La conversión de cadena en número puede realizarse mediante la serie de funciones stoX (). Los miembros de esta serie de funciones pueden convertir cadenas en tipos de números int, long, float y double. La sintaxis específica es la siguiente:

int stoi (const strings str, size_t * pos = 0, int base = 10)
long stol (const strings str, size_t * pos = 0, int base = 10)
float stof (const strings str, size_t * pos = 0)
double stod (cadenas const strings, size_t * pos = 0)

El primer parámetro formal str es una cadena (como "-342" o "3.48", etc.), que se convertirá a la forma digital adecuada. Estas funciones pueden convertir el prefijo más largo posible de str en un número y devolver una dirección entera pos, donde el índice del primer carácter que no se puede convertir se almacena en pos. El tipo size_t se define en la biblioteca estándar y se utiliza a menudo para representar el tamaño de un entero sin signo o un índice en una matriz, vector o cadena.

Por ejemplo, si intenta convertir la cadena "-34iseven", el entero -34 se devolverá correctamente y la posición pos del primer carácter que no se puede convertir se establece en 3. El parámetro base solo se aplica a la conversión de números enteros e indica la base utilizada para la conversión. Tanto los parámetros pos como base son opcionales, por lo que pueden ignorarse. Si se omite pos, el índice del carácter de parada no se almacenará. Si se omite la base, el valor predeterminado es decimal. Si la cadena str contiene un valor no válido, como "is-34 even?", No se realizará ninguna conversión y la función arrojará una excepción invalid_argument.

El siguiente programa demuestra el uso de la función de conversión de cadenas:

Copia de texto sin formato
 
  1. // Este programa demuestra el uso de stoXXX ()
  2. // funciones de conversión numérica.
  3. #include <cadena>
  4. #include <iostream>
  5. usando el espacio de nombres std;
  6.  
  7. int main ()
  8. {
  9. string str; // cadena para convertir
  10. size_t pos; // Mantener la posición del personaje que se detiene
  11. // Convertir cadena a doble
  12. str = "-342.57es un número";
  13. cout << "La cadena es" << str << endl;
  14. doble d = stod (str, & pos);
  15. cout << "El doble convertido es" << d << endl;
  16. cout << "El carácter de parada es" << str [pos] << "en la posición" << pos << endl;
  17. // Convertir cadena a int (predeterminado a decimal)
  18. str = "-342.57es un número";
  19. cout << "\ nLa cadena es" << str << endl;
  20. int i = stoi (str, & pos);
  21. cout << "El entero convertido es" << i << endl;
  22. cout << "El carácter de parada es" << str [pos] << "en la posición" << pos << endl;
  23. // Convertir cadena a int (la base es binaria)
  24. str = "01110número binario";
  25. cout << "\ nLa cadena es" << str << endl;
  26. i = stoi (str, & pos, 2);
  27. cout << "El entero binario convertido es" << i << endl;
  28. cout << "El carácter de parada es" << str [pos] << "en la posición" << pos << endl;
  29. return 0;
  30. }

Salida del programa:

La cadena es -342.57 es un número
El doble convertido es -342.57
El carácter final es i en la posición 7

La cadena es -342.57 es un número
El entero convertido es -342
El carácter final es. en la posición 4

La cadena es 01110 número
binario El entero binario convertido es 14
El carácter de parada es b en la posición 5

Supongo que te gusta

Origin blog.csdn.net/digitalkee/article/details/108237482
Recomendado
Clasificación