stringstream到底是做什么的?
我想从昨天开始学习C ++,我正在使用这个文档: http : //www.cplusplus.com/files/tutorial.pdf (第32页)。 我在文档中find一个代码,然后运行它。 我试着inputRs 5.5的价格和一个整数的数量和输出为0.我试着input5.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命令究竟做了什么? 从文档引用:
“在这个例子中,我们从标准input中间接获取数字值,而不是直接从标准input中提取数值,而是从标准input(cin)中获取行到string对象(mystr)中,然后我们提取整数从这个string的值到一个int(数量)types的variables。“
我的印象是这个函数将把string的整个部分作为input。
(这里我不完全知道如何提出问题,我也是编程新手)谢谢。
有时使用stringstream在string和其他数字types之间转换非常方便。 stringstream的用法与iostream的用法类似,所以不是学习的负担。
Stringstreams可用于读取string和将数据写入string。 它主要使用string缓冲区,但没有真正的I / O通道。
stringstream类的基本成员函数是
-
str()
,它返回stringtypes的缓冲区的内容。 -
str(string)
,它将缓冲区的内容设置为string参数。
这里是一个如何使用stringstream的例子。
ostringstream os; os << "dec: " << 15 << " hex: " << std::hex << 15 << endl; cout << os.str() << endl;
结果是dec:hex:f。
istringstream
或多或less是相同的用法。
总而言之,stringstream是像独立I / O设备一样操纵string的一种便捷方式。
仅供参考,这些类之间的inheritance关系是:
回答这个问题。 stringstream
基本上允许你像一个stream
一样处理一个string
对象,并使用它的所有stream
函数和操作符。
我看到它主要用于格式化输出/input的好处。
一个很好的例子是将数字转换为stream对象的c++
实现。
可能的例子:
template <class T> string num2str(const T& num, unsigned int prec = 12) { string ret; stringstream ss; ios_base::fmtflags ff = ss.flags(); ff |= ios_base::floatfield; ff |= ios_base::fixed; ss.flags(ff); ss.precision(prec); ss << num; ret = ss.str(); return ret; };
也许这有点复杂,但是相当复杂。 你创buildstringstream
对象ss
,修改它的标志,用operator<<
把一个数字放进去,并通过str()
提取出来。 我想operator>>
可以使用。
同样在这个例子中, string
缓冲区是隐藏的而不是显式使用的。 但是写一篇关于每个可能的方面和用例的文章都太长了。
注意:我大概是从SO上的某个人那里偷来的,但是我没有原创的作者。
从C ++入门 :
istringstreamtypes读取string , ostringstream写入string ,而stringstream读取和写入string 。
我遇到了一些使用stringstream既方便又简洁的例子。
情况1
这是来自这个leetcode问题 的解决scheme之一 。 它演示了一个非常合适的情况,使用stringstream是高效和简洁的。
假设a
和b
是以string格式表示的复数,我们想要以string格式得到a
和b
相乘的结果。 代码如下:
string a = "1+2i", b = "1+3i"; istringstream sa(a), sb(b); ostringstream out; int ra, ia, rb, ib; char buff; // only read integer values to get the real and imaginary part of // of the original complex number sa >> ra >> buff >> ia >> buff; sb >> rb >> buff >> ib >> buff; out << ra*rb-ia*ib << '+' << ra*ib+ia*rb << 'i'; // final result in string format string result = out.str()
情况2
这也是从一个leetcode问题 ,需要您简化给定的pathstring, 使用stringstream的解决scheme之一是我所见过的最优雅的:
string simplifyPath(string path) { string res, tmp; vector<string> stk; stringstream ss(path); while(getline(ss,tmp,'/')) { if (tmp == "" or tmp == ".") continue; if (tmp == ".." and !stk.empty()) stk.pop_back(); else if (tmp != "..") stk.push_back(tmp); } for(auto str : stk) res += "/"+str; return res.empty() ? "/" : res; }
如果不使用stringstream,编写这样简洁的代码将会很困难。
你input了一个字母数字和int,在mystr
分隔的mystr
。
然后,您尝试将第一个标记(空白分隔)转换为一个int
。
第一个标记是RS,它没有转换为int
,为myprice留下一个零,我们都知道什么是零。
当你第二次只inputint值时,一切都按照你的预期工作。
这是虚假的RS导致你的代码失败。