J'essaye d'apprendre le C ++ depuis hier et j'utilise ce document: http://www.cplusplus.com/files/tutorial.pdf (page 32). J'ai trouvé un code dans le document et je l'ai exécuté. J'ai essayé d'entrer Rs 5,5 pour le prix et un entier pour la quantité et la sortie était de 0. J'ai essayé d'entrer 5,5 et 6 et la sortie était correcte.
// 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;
}
Question: Que fait exactement la commande mystring? Citant le document:
"Dans cet exemple, nous acquérons indirectement des valeurs numériques à partir de l'entrée standard. Au lieu d'extraire des valeurs numériques directement de l'entrée standard, nous obtenons des lignes de l'entrée standard (cin) dans un objet chaîne (mystr), puis nous extrayons l'entier valeurs de cette chaîne dans une variable de type int (quantité). "
Mon impression était que la fonction prendra la partie intégrante d'une chaîne et l'utilisera comme entrée.
(Je ne sais pas exactement comment poser une question ici. Je suis également nouveau dans la programmation) Merci.
stringstream
utilisé de cette façon. Habituellement, je charge la ligne, la convertit puis l'extrait par parties, mais cela n'a évidemment que peu d'avantages ici car ilcin
s'agit déjà d'un flux d'entrée ... Cecin >> price >> quantity;
serait donc de loin plus simple. Ce serait une bonne raison de NE PAS utiliser les didacticiels cplusplus.com.stringstream
marche. C'est un exemple bizarre probablement même mauvais =) Mais cela montre que vous pouvez traiter la chaîne comme un flux.stringstream
c'est certainement un mauvais exemple. Et même si c'est le cas, il devrait être écrit différemment.Réponses:
Parfois, il est très pratique d'utiliser stringstream pour convertir entre des chaînes et d'autres types numériques. L'utilisation de
stringstream
est similaire à l'utilisation deiostream
, donc ce n'est pas un fardeau à apprendre.Les chaînes de caractères peuvent être utilisées à la fois pour lire des chaînes et pour écrire des données dans des chaînes. Il fonctionne principalement avec un tampon de chaîne, mais sans véritable canal d'E / S.
Les fonctions membres de base de la classe stringstream sont
str()
, qui renvoie le contenu de son tampon sous forme de chaîne.str(string)
, qui définit le contenu du tampon sur l'argument chaîne.Voici un exemple d'utilisation des flux de chaînes.
Le résultat est
dec: 15 hex: f
.istringstream
est plus ou moins du même usage.Pour résumer, stringstream est un moyen pratique de manipuler des chaînes comme un périphérique d'E / S indépendant .
Pour info, les relations d'héritage entre les classes sont:
la source
Pour répondre à la question.
stringstream
vous permet essentiellement de traiter unstring
objet comme unstream
, et d'utiliser toutes lesstream
fonctions et opérateurs sur celui-ci.Je l'ai vu utilisé principalement pour la qualité de sortie / entrée formatée.
Un bon exemple serait la
c++
mise en œuvre de la conversion d'un nombre en objet de flux.Exemple possible:
C'est peut-être un peu compliqué mais c'est assez complexe. Vous créez un
stringstream
objetss
, modifiez ses drapeaux, mettez un numéro dedans avecoperator<<
, et extrayez-le viastr()
. Je suppose que celaoperator>>
pourrait être utilisé.Dans cet exemple également, le
string
tampon est masqué et n'est pas utilisé explicitement. Mais ce serait trop long pour écrire sur tous les aspects et cas d'utilisation possibles.Remarque: je l'ai probablement volé à quelqu'un sur SO et affiné, mais je n'ai pas l'auteur original noté.
la source
ret
n'est pas nécessaire, on pourrait écrirereturn ss.str();
.À partir de l' amorce C ++ :
Je rencontre des cas où il est à la fois pratique et concis d'utiliser stringstream .
cas 1
C'est l' une des solutions à ce problème de leetcode . Cela démontre un cas très approprié où l'utilisation de stringstream est efficace et concise.
Supposons que
a
etb
soient des nombres complexes exprimés au format chaîne, nous voulons obtenir le résultat de la multiplication dea
etb
également au format chaîne. Le code est comme suit:cas 2
C'est aussi à partir d'un problème de leetcode qui vous oblige à simplifier la chaîne de chemin donnée, l' une des solutions utilisant stringstream est la plus élégante que j'ai vue:
Sans l'utilisation de stringstream, il serait difficile d'écrire un code aussi concis.
la source
Vous avez entré un alphanumérique et un entier, délimités par un vide
mystr
.Vous avez ensuite essayé de convertir le premier jeton (délimité par des blancs) en un fichier
int
.Le premier jeton était RS qui n'a pas réussi à se convertir
int
, laissant un zéro pour mon prix, et nous savons tous ce que rapporte zéro fois tout.Lorsque vous n'avez entré des valeurs int que la deuxième fois, tout fonctionnait comme prévu.
C'est le faux RS qui a causé l'échec de votre code.
la source