Estoy tratando de aprender C ++ desde ayer y estoy usando este documento: http://www.cplusplus.com/files/tutorial.pdf (página 32). Encontré un código en el documento y lo ejecuté. Intenté ingresar Rs 5.5 para el precio y un número entero para la cantidad y la salida fue 0. Intenté ingresar 5.5 y 6 y la salida fue correcta.
// stringstreams
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main ()
{
string mystr;
float price = 0;
int quantity = 0;
cout << "Enter price: ";
getline (cin,mystr);
stringstream(mystr) >> price;
cout << "Enter quantity: ";
getline (cin,mystr);
stringstream(mystr) >> quantity;
cout << "Total price: " << price*quantity << endl;
return 0;
}
Pregunta: ¿Qué hace exactamente el comando mystring? Citando del documento:
"En este ejemplo, adquirimos valores numéricos de la entrada estándar de forma indirecta. En lugar de extraer valores numéricos directamente de la entrada estándar, obtenemos líneas de la entrada estándar (cin) en un objeto de cadena (mystr) y luego extraemos el número entero valores de esta cadena en una variable de tipo int (cantidad) ".
Mi impresión fue que la función tomará la parte integral de una cadena y la usará como entrada.
(No sé exactamente cómo hacer una pregunta aquí. También soy nuevo en la programación) Gracias.
stringstream
usado de esa manera. Por lo general, cargo la línea, la convierto y luego la extraigo por partes, sin embargo, esto obviamente tiene poca ventaja aquí porque yacin
es un flujo de entrada ... Asícin >> price >> quantity;
que sería mucho más simple. Esa sería una buena razón para NO usar los tutoriales de cplusplus.com.stringstream
funciona. Es extraño, probablemente incluso malo =) Pero muestra que puedes tratar la cadena como una secuencia.stringstream
, definitivamente es un ejemplo incorrecto. E incluso si lo es, debería escribirse de manera diferente.Respuestas:
A veces es muy conveniente usar stringstream para convertir entre cadenas y otros tipos numéricos. El uso de
stringstream
es similar al uso deiostream
, por lo que no es una carga para aprender.Stringstreams se puede utilizar tanto para leer cadenas como para escribir datos en cadenas. Funciona principalmente con un búfer de cadena, pero sin un canal de E / S real.
Las funciones miembro básicas de la clase stringstream son
str()
, que devuelve el contenido de su búfer en tipo de cadena.str(string)
, que establece el contenido del búfer en el argumento de cadena.A continuación, se muestra un ejemplo de cómo utilizar secuencias de cadenas.
El resultado es
dec: 15 hex: f
.istringstream
es de más o menos el mismo uso.En resumen, stringstream es una forma conveniente de manipular cadenas como un dispositivo de E / S independiente .
Para su información, las relaciones de herencia entre las clases son:
fuente
Para responder a la pregunta.
stringstream
básicamente le permite tratar unstring
objeto como astream
, y usar todas lasstream
funciones y operadores en él.Lo vi utilizado principalmente para la bondad de entrada / salida formateada.
Un buen ejemplo sería la
c++
implementación de convertir un número en un objeto de flujo.Posible ejemplo:
Quizás sea un poco complicado pero es bastante complejo. Usted crea un
stringstream
objetoss
, modifica sus banderas, le pone un númerooperator<<
y lo extrae mediantestr()
. Supongooperator>>
podría usarse.También en este ejemplo, el
string
búfer está oculto y no se usa explícitamente. Pero sería una publicación demasiado larga para escribir sobre todos los aspectos y casos de uso posibles.Nota: Probablemente se lo robé a alguien en SO y lo refiné, pero no tengo el autor original anotado.
fuente
ret
es innecesario, se podría escribirreturn ss.str();
.Desde C ++ Primer :
Encontré algunos casos en los que es conveniente y conciso usar stringstream .
caso 1
Es de una de las soluciones para este problema de código de lectura . Demuestra un caso muy adecuado donde el uso de stringstream es eficiente y conciso.
Supongamos que
a
yb
son números complejos expresados en formato de cadena, queremos obtener el resultado de la multiplicación dea
yb
también en formato de cadena. El código es el siguiente:caso 2
También es de un problema de código de lectura que requiere que simplifique la cadena de ruta dada, una de las soluciones que usa stringstream es la más elegante que he visto:
Sin el uso de stringstream, sería difícil escribir un código tan conciso.
fuente
Ingresó alfanumérico e int, en blanco delimitado en
mystr
.Luego intentó convertir el primer token (delimitado por espacios en blanco) en un archivo
int
.El primer token fue RS, que no se pudo convertir
int
, dejando un cero para myprice, y todos sabemos lo que rinde cero veces cualquier cosa.Cuando solo ingresó valores int la segunda vez, todo funcionó como esperaba.
Fue el RS espurio lo que hizo que tu código fallara.
fuente