stringstream 到底是做什么的?

新手上路,请多包涵

我从昨天开始尝试学习 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(数量)类型的变量。”

我的印象是该函数将采用字符串的一个组成部分并将其用作输入。

原文由 user3104350 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

有时使用 stringstream 在字符串和其他数值类型之间进行转换非常方便。 stringstream 的用法 iostream ,所以学习起来不是负担。

字符串流可用于读取字符串和将数据写入字符串。它主要与字符串缓冲区一起工作,但没有真正的 I/O 通道。

stringstream 类的基本成员函数是

  • str() ,它以字符串类型返回其缓冲区的内容。

  • str(string) ,将缓冲区的内容设置为字符串参数。

这是一个如何使用字符串流的示例。

 ostringstream os;
os << "dec: " << 15 << " hex: " << std::hex << 15 << endl;
cout << os.str() << endl;

结果是 dec: 15 hex: f

istringstream 或多或少是相同的用法。

总而言之,stringstream 是一种 像独立 I/O 设备一样操作字符串 的便捷方式。

仅供参考,类之间的继承关系是:

字符串流类

原文由 richard.g 发布,翻译遵循 CC BY-SA 3.0 许可协议

来自 _C++ 入门_:

istringstream 类型读取 _字符串_, ostringstream 写入 _字符串_,而 stringstream 读取和写入 _字符串_。

我遇到过一些使用 stringstream 既方便又简洁的情况。

情况1

它来自 这个 leetcode 问题 的解决方案之一。它演示了一个非常适合使用 stringstream 高效且简洁的案例。

a and b are complex numbers expressed in string format, we want to get the result of multiplication of a and b also in字符串格式。代码如下:

 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 问题使用 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;
 }

如果不使用 stringstream,就很难写出如此简洁的代码。

原文由 jdhao 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题