Я пытаюсь выучить C ++ со вчерашнего дня и использую этот документ: http://www.cplusplus.com/files/tutorial.pdf (стр. 32). Я нашел код в документе и запустил его. Я попытался ввести 5,5 рупий для цены и целое число для количества, и результат был 0. Я попытался ввести 5,5 и 6, и результат был правильным.
// 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;
}
Вопрос: Что именно делает команда mystring? Цитата из документа:
"В этом примере мы получаем числовые значения из стандартного ввода косвенно. Вместо извлечения числовых значений непосредственно из стандартного ввода мы получаем строки из стандартного ввода (cin) в строковый объект (mystr), а затем извлекаем целое число значения из этой строки в переменную типа int (количество) ".
У меня сложилось впечатление, что функция будет принимать неотъемлемую часть строки и использовать ее в качестве входных данных.
(Я точно не знаю, как здесь задать вопрос. Я тоже новичок в программировании) Спасибо.
stringstream
использовался таким образом. Обычно я загружаю строку, конвертирую ее, а затем извлекаю по частям, однако это явно не имеет здесь большого преимущества, потому чтоcin
это уже входной поток ... Такcin >> price >> quantity;
было бы намного проще. Это будет хорошей причиной НЕ использовать учебные материалы cplusplus.com.stringstream
работает. Это странно, возможно, даже плохо =) Но это показывает, что вы можете рассматривать строку как поток.stringstream
то это определенно неверный пример. И даже если это так, то надо писать иначе.Ответы:
Иногда очень удобно использовать stringstream для преобразования между строками и другими числовыми типами. Использование
stringstream
аналогично использованиюiostream
, поэтому изучать его не составляет труда .Stringstreams можно использовать как для чтения строк, так и для записи данных в строки. В основном он работает со строковым буфером, но без реального канала ввода-вывода.
Основные функции-члены класса stringstream:
str()
, который возвращает содержимое своего буфера строкового типа.str(string)
, который устанавливает содержимое буфера в строковый аргумент.Вот пример того, как использовать строковые потоки.
Результат есть
dec: 15 hex: f
.istringstream
имеет более или менее такое же употребление.Подводя итог, можно сказать, что stringstream - это удобный способ манипулировать строками как независимым устройством ввода-вывода .
К вашему сведению, отношения наследования между классами:
источник
Чтобы ответить на вопрос.
stringstream
в основном позволяет обращаться сstring
объектом как с astream
и использовать с ним всеstream
функции и операторы.Я видел, что он использовался в основном для форматированного вывода / ввода.
Хорошим примером может быть
c++
реализация преобразования числа в объект потока.Возможный пример:
Может быть, это немного сложно, но довольно сложно. Вы создаете
stringstream
объектss
, изменяете его флаги, вставляете в него числоoperator<<
и извлекаете его черезstr()
. Думаю, этоoperator>>
можно было бы использовать.Также в этом примере
string
буфер скрыт и не используется явно. Но это был бы слишком длинный пост, чтобы писать обо всех возможных аспектах и сценариях использования.Примечание: я, вероятно, украл его у кого-то на SO и уточнил, но у меня нет оригинального автора.
источник
ret
необязательно, можно было бы написатьreturn ss.str();
.Из C ++ Primer :
Я сталкивался с некоторыми случаями, когда использовать stringstream одновременно и удобно, и кратко .
Случай 1
Это от одного из решений для этой проблемы leetcode . Он демонстрирует очень подходящий случай, когда использование stringstream эффективно и кратко.
Предположим, что
a
иb
- комплексные числа, выраженные в строковом формате, мы хотим получить результат умножения,a
аb
также в строковом формате. Код выглядит следующим образом:случай 2
Это также из-за проблемы leetcode, которая требует от вас упрощения заданной строки пути, одно из решений, использующих stringstream, является наиболее элегантным, что я видел:
Без использования строкового потока было бы сложно написать такой краткий код.
источник
Вы ввели буквенно-цифровые и целые числа, разделенные пробелами
mystr
.Затем вы попытались преобразовать первый токен (разделенный пробелами) в файл
int
.Первым токеном был RS, который не удалось преобразовать в
int
, оставив ноль для myprice, и все мы знаем, что дает ноль, умноженное на что-либо.Когда вы во второй раз вводили только значения int, все работало так, как вы ожидали.
Это был ложный RS, который привел к сбою вашего кода.
источник