我从昨天开始学习C++并且正在使用这个文档:http://www.cplusplus.com/files/tutorial.pdf(第32页).我在文档中找到了一个代码,然后运行它.我尝试输入Rs 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;
}
Run Code Online (Sandbox Code Playgroud)
问题:mystring命令究竟做了什么?引自文件:
"在这个例子中,我们间接从标准输入中获取数值.不是直接从标准输入中提取数值,而是从标准输入(cin)获取行到字符串对象(mystr),然后我们提取整数此字符串中的值为int(quantity)类型的变量."
我的印象是该函数将采用字符串的组成部分并将其用作输入.
(我不知道如何在这里提问.我也是编程的新手)谢谢.
ric*_*d.g 156
有时使用stringstream在字符串和其他数字类型之间进行转换非常方便.用法stringstream类似于用法iostream,因此不是学习的负担.
Stringstreams既可用于读取字符串,也可将数据写入字符串.它主要使用字符串缓冲区,但没有真正的I/O通道.
stringstream类的基本成员函数是
str(),以字符串类型返回其缓冲区的内容.
str(string),它将缓冲区的内容设置为字符串参数.
以下是如何使用字符串流的示例.
ostringstream os;
os << "dec: " << 15 << " hex: " << std::hex << 15 << endl;
cout << os.str() << endl;
Run Code Online (Sandbox Code Playgroud)
结果是dec: 15 hex: f.
istringstream 或多或少相同的用法.
总而言之,stringstream是一种操作字符串的便捷方式,就像独立的I/O设备一样.
仅供参考,类之间的继承关系是:

luk*_*k32 18
回答这个问题.stringstream基本上允许您将string对象视为a stream,并使用其上的所有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;
};
Run Code Online (Sandbox Code Playgroud)
也许它有点复杂,但它非常复杂.您可以创建stringstream对象ss,修改其标志,将数字放入其中operator<<,然后通过它提取str().我想这operator>>可以用.
此外,在此示例中,string缓冲区被隐藏,未明确使用.但是关于每个可能的方面和用例,写一篇文章的时间太长了.
注意:我可能从SO上的某个人那里偷了它并且很精致,但我没有注意到原作者.
jdh*_*hao 16
来自C++ Primer:
该istringstream型读取一个字符串,ostringstream写入字符串,以及字符串流读取和写入字符串.
我遇到过一些使用stringstream既方便又简洁的情况.
这是从解决方案之一为这个问题本文给出了.它演示了一个非常合适的情况,其中stringstream的使用是高效和简洁的.
假设a并且b是以字符串格式表示的复数,我们希望得到乘法的结果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()
Run Code Online (Sandbox Code Playgroud)
它也来自一个leetcode问题,需要你简化给定的路径字符串,使用stringstream的解决方案之一是我见过的最优雅:
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;
}
Run Code Online (Sandbox Code Playgroud)
如果不使用stringstream,就很难编写这样简洁的代码.
| 归档时间: |
|
| 查看次数: |
240297 次 |
| 最近记录: |