Od wczoraj staram się uczyć C ++ i używam tego dokumentu: http://www.cplusplus.com/files/tutorial.pdf (strona 32). Znalazłem kod w dokumencie i uruchomiłem go. Próbowałem wprowadzić Rs 5,5 dla ceny i liczbę całkowitą dla ilości i na wyjściu było 0. Próbowałem wprowadzić 5,5 i 6 i wyjście było poprawne.
// 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;
}
Pytanie: Co dokładnie robi polecenie mystring? Cytat z dokumentu:
„W tym przykładzie pośrednio pobieramy wartości liczbowe ze standardowego wejścia. Zamiast wyodrębniać wartości liczbowe bezpośrednio ze standardowego wejścia, pobieramy wiersze ze standardowego wejścia (cin) do obiektu łańcuchowego (mystr), a następnie wyodrębniamy liczbę całkowitą wartości z tego ciągu do zmiennej typu int (ilość). "
Odniosłem wrażenie, że funkcja weźmie integralną część łańcucha i użyje jej jako danych wejściowych.
(Nie wiem dokładnie, jak zadać tutaj pytanie. Jestem też nowy w programowaniu) Dziękuję.
stringstream
używany w ten sposób. Zwykle ładuję linię, konwertuję ją, a następnie wyodrębniam na części, jednak ma to oczywiście niewielką zaletę, ponieważcin
jest już strumieniem wejściowym ... Więccin >> price >> quantity;
byłoby o wiele prostsze. To byłby dobry powód, aby NIE używać samouczków cplusplus.com.stringstream
działa. Jest to dziwaczne, prawdopodobnie nawet złe =) Ale pokazuje, że możesz traktować ciąg jako strumień.stringstream
to zdecydowanie jest to zły przykład. A nawet jeśli tak, to powinno być inaczej napisane.Odpowiedzi:
Czasami bardzo wygodne jest użycie stringstream do konwersji między łańcuchami i innymi typami liczbowymi. Używanie
stringstream
jest podobne do używaniaiostream
, więc nauka nie jest ciężarem.Stringstreams może służyć zarówno do odczytywania ciągów, jak i do zapisywania danych w łańcuchach. Działa głównie z buforem łańcuchowym, ale bez prawdziwego kanału I / O.
Podstawowe funkcje składowe klasy stringstream to
str()
, która zwraca zawartość swojego bufora w postaci łańcucha.str(string)
, które ustawiają zawartość buforu na argument ciągu.Oto przykład użycia strumieni ciągów.
Wynik jest
dec: 15 hex: f
.istringstream
ma mniej więcej takie samo zastosowanie.Podsumowując, stringstream to wygodny sposób na manipulowanie łańcuchami jak niezależne urządzenie we / wy .
FYI, relacje dziedziczenia między klasami są następujące:
źródło
Aby odpowiedzieć na pytanie.
stringstream
w zasadzie pozwala traktowaćstring
obiekt jak astream
i używać na nim wszystkichstream
funkcji i operatorów.Widziałem, że jest używany głównie do sformatowanych danych wyjściowych / wejściowych.
Dobrym przykładem może być
c++
implementacja konwersji liczby na obiekt strumieniowy.Możliwy przykład:
Może jest to trochę skomplikowane, ale jest dość złożone. Tworzysz
stringstream
obiektss
, modyfikujesz jego flagi, umieszczasz w nim liczbęoperator<<
i wyodrębniasz za pomocąstr()
. Myślę, żeoperator>>
można to wykorzystać.Również w tym przykładzie
string
bufor jest ukryty i nie jest używany jawnie. Jednak wpis o każdym możliwym aspekcie i przypadku użycia byłby zbyt długi.Uwaga: prawdopodobnie ukradłem go komuś na SO i dopracowałem, ale nie odnotowałem oryginalnego autora.
źródło
ret
jest niepotrzebne, można by napisaćreturn ss.str();
.Z C ++ Primer :
Spotykam się z przypadkami, w których użycie stringstreamu jest zarówno wygodne, jak i zwięzłe .
przypadek 1
To właśnie z jednym z rozwiązań dla tego problemu leetcode . Pokazuje bardzo odpowiedni przypadek, w którym użycie stringstream jest wydajne i zwięzłe.
Załóżmy
a
ib
są liczbami zespolonymi wyrażone w formacie ciągu chcemy uzyskać wynik mnożeniaa
ab
także w formacie strun. Kod wygląda następująco:przypadek 2
Wynika to również z problemu z kodem leetcode, który wymaga uproszczenia podanego ciągu ścieżki, jedno z rozwiązań wykorzystujących stringstream jest najbardziej eleganckie, jakie widziałem:
Trudno byłoby napisać taki zwięzły kod bez użycia stringstream.
źródło
Wpisałeś alfanumeryczny i int, oddzielony spacją
mystr
.Następnie próbowałeś przekonwertować pierwszy token (rozdzielany spacjami) na plik
int
.Pierwszym tokenem był RS, którego nie udało się przekonwertować na
int
, pozostawiając zero dla myprice, a wszyscy wiemy, ile daje zero razy cokolwiek.Gdy wprowadziłeś tylko wartości int za drugim razem, wszystko działało zgodnie z oczekiwaniami.
To fałszywy RS spowodował awarię twojego kodu.
źródło