Estou tentando aprender C ++ desde ontem e estou usando este documento: http://www.cplusplus.com/files/tutorial.pdf (página 32). Encontrei um código no documento e o executei. Tentei inserir Rs 5,5 para preço e um inteiro para quantidade e a saída foi 0. Tentei inserir 5,5 e 6 e a saída estava correta.
// 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;
}
Pergunta: O que exatamente o comando mystring faz? Citação do documento:
"Neste exemplo, adquirimos valores numéricos da entrada padrão indiretamente. Em vez de extrair valores numéricos diretamente da entrada padrão, obtemos linhas da entrada padrão (cin) em um objeto de string (mystr) e, em seguida, extraímos o inteiro valores desta string em uma variável do tipo int (quantidade). "
Minha impressão é que a função pegará a parte integrante de uma string e a usará como entrada.
(Não sei exatamente como fazer uma pergunta aqui. Também sou novo em programação) Obrigado.
stringstream
usado assim. Eu geralmente carrego a linha, converto e extraio por partes, no entanto, isso obviamente tem pouca vantagem aqui porque jácin
é um fluxo de entrada ... Entãocin >> price >> quantity;
seria muito mais simples. Essa seria uma boa razão para NÃO usar os tutoriais do cplusplus.com.stringstream
funciona. É bizarro, provavelmente até ruim =) Mas mostra que você pode tratar cordas como um riacho.stringstream
, é definitivamente um exemplo errado. E mesmo que seja, deve ser escrito de forma diferente.Respostas:
Às vezes, é muito conveniente usar stringstream para converter entre strings e outros tipos numéricos. O uso de
stringstream
é semelhante ao uso deiostream
, portanto, não é um fardo aprender.Stringstreams podem ser usados para ler strings e gravar dados em strings. Funciona principalmente com um buffer de string, mas sem um canal de E / S real.
As funções-membro básicas da classe stringstream são
str()
, que retorna o conteúdo de seu buffer no tipo string.str(string)
, que define o conteúdo do buffer para o argumento string.Aqui está um exemplo de como usar streams de string.
O resultado é
dec: 15 hex: f
.istringstream
tem mais ou menos o mesmo uso.Para resumir, stringstream é uma maneira conveniente de manipular strings como um dispositivo de E / S independente .
Para sua informação, as relações de herança entre as classes são:
fonte
Para responder à pergunta.
stringstream
basicamente permite que você trate umstring
objeto como umstream
e use todas asstream
funções e operadores nele.Eu vi que é usado principalmente para a qualidade de saída / entrada formatada.
Um bom exemplo seria a
c++
implementação da conversão de número em objeto de fluxo.Exemplo possível:
Talvez seja um pouco complicado, mas é bastante complexo. Você cria um
stringstream
objetoss
, modifica seus sinalizadores, coloca um número nele comoperator<<
e o extrai viastr()
. Eu acho que issooperator>>
poderia ser usado.Também neste exemplo, o
string
buffer está oculto e não é usado explicitamente. Mas seria uma postagem muito longa para escrever sobre todos os aspectos e casos de uso possíveis.Nota: Provavelmente roubei de alguém no SO e refinei, mas não tenho o autor original mencionado.
fonte
ret
é desnecessário, pode-se escreverreturn ss.str();
.Do C ++ Primer :
Encontrei alguns casos em que é conveniente e conciso usar stringstream .
caso 1
É de uma das soluções para este problema de leetcode . Ele demonstra um caso muito adequado em que o uso de stringstream é eficiente e conciso.
Suponha que
a
eb
sejam números complexos expressos em formato de string, queremos obter o resultado da multiplicação dea
eb
também no formato de string. O código é o seguinte:caso 2
Também é devido a um problema de leetcode que exige que você simplifique a string de caminho fornecida, uma das soluções usando stringstream é a mais elegante que já vi:
Sem o uso de stringstream, seria difícil escrever um código tão conciso.
fonte
Você inseriu um alfanumérico e inteiro, delimitado em branco por
mystr
.Em seguida, você tentou converter o primeiro token (delimitado em branco) em um
int
.O primeiro token foi RS que falhou na conversão para
int
, deixando um zero para myprice, e todos nós sabemos quanto zero vezes qualquer coisa rende.Quando você inseriu apenas valores int na segunda vez, tudo funcionou conforme o esperado.
Foi o RS espúrio que causou a falha do seu código.
fonte