当前位置:   article > 正文

stringstream用法总结

stringstream用法

目录

一、概念

二、基本功能

功能一:预定的格式将程序中的数据保存在一个string 中

功能二:实现类型转换

         功能三:实现任意类型转换

三、重要功能

1.数字由空格或逗号分开。

2.数字由逗号分开

3.数字间不止一类符号分隔


一、概念

C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。

istringstream类用于执行C++风格的串流的输入操作。 
ostringstream类用于执行C风格的串流的输出操作。 
strstream类同时可以支持C风格的串流的输入输出操作。

istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和 stringstreambase派生而来, stringstream则是从iostream类和stringstreambase派生而来。

他们的继承关系如下图所示:

std::stringstream用法 - 505373805 - 505373805的博客

istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。 
istringstream的构造函数原形如下: 

istringstream::istringstream(string str);

C++ stringstream 类是一种十分有用的类,特别是当我们需要在程序中使用字符串和数字数据的时候。要想在程序中使用 stringstream 类,我们需要在源程序文件中包含头文件include<sstream>。stringstream 对象的使用方法与cout对象的使用方法基本相同。stringstream 类提供的函数,将数字化转化为字符串。

当我们需要按预定的格式将程序中的数据保存在一个string 中的时候,可以先创建一个stringstream 对象,并通过运算符 ”<<“ 将数据传递给 stringstream 对象。(这与通过”<<“ 使用cout 对象的方法相同。)接着,我们可以通过调用stringstream 类的函数str() 将对象所包含的内容赋给一个string对象。在一下的程序中,我们先将数据传递给一个stringstream 对象,然后通过该 stringstream 对象将数值赋给一个string 对象。住:cout能使用的所有ios格式标记也可以在stringstream 对象中使用。

二、基本功能

功能一:预定的格式将程序中的数据保存在一个string 中

  1. // 如何使用 stringstream
  2. // 对象生成格式化的 string
  3. #include <iostream>
  4. #include <string>
  5. #include <sstream>
  6. using namespace std;
  7. int main()
  8. {
  9. cout << "\n Welcome to the StringStream Demo program.\n";
  10. // 构建一些将在string中出现的数据变量
  11. // PI 精确到小数点后15位
  12. double pi = 3.141592653589793;
  13. float dollar = 1.00;
  14. int dozen = 12;
  15. string text;
  16. // 我们希望tring 的格式如下:
  17. // dozen适12,dollar是$1.00
  18. // 精确到小数点后10为pi是3.141592653589793
  19. // 生成stringstream 对象
  20. stringstream ss;
  21. // 现在像使用cout一样使用ss
  22. ss << " A dozen is "<< dozen << ", a dollar is $ ";
  23. ss.setf(ios::fixed);
  24. ss.precision(2);
  25. ss << dollar << " and \n the value of pi to 10 places is ";
  26. ss.precision(10);
  27. ss << pi << ".";
  28. // 现在将ss中的内容赋给一个string对象
  29. // 使用str()函数
  30. text = ss.str();
  31. cout << "\nHere is our formatted text string:\n" << text << endl;
  32. // 再加入一些信息
  33. ss << "\ There are 2 \"+\" in C++.";
  34. text = ss.str();
  35. cout<< "\nHere is the final string:\n" << text << endl;
  36. return 0;
  37. }

功能二:实现类型转换

string到 int / double 的转换

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5. int main()
  6. {
  7. double rb;
  8. int ri; // 存储结果
  9. string s; // 要转化的字符串
  10. stringstream ss;
  11. s = "123.456789";
  12. ss << s; // 类似 cout
  13. ss >> rb; // 类似 cin
  14. cout.precision(10);
  15. cout << "string \""<< s << "\" to double object "
  16. << rb << endl;
  17. s = "654321";
  18. ss.clear(); //清空流
  19. ss << s;
  20. ss >> ri;
  21. cout << "string \""<< s << "\" to int object "
  22. << ri << endl;
  23. return 0;
  24. }

功能三:实现任意类型转换

  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. using namespace std;
  5. template <class t1="" class="" t2="">
  6. int main()
  7. {
  8. double sb = 123.456;
  9. int ri; // 存储结果
  10. stringstream ss;
  11. ss << sb;
  12. ss >> ri;
  13. cout << ri;
  14. return 0;
  15. }

该功能没多少实际意义,不如static_cast 来的简单。 

三、重要功能

写这篇文章的目的主要是解决在笔试过程中,利用stringstream解决输入的问题。

解决问题的关键是,以stringstream为输入流,然后以getline识别分隔符然后进行处理。

常见输入是一行,然后将其放入vector中。

1.数字由空格或逗号分开。

5 1 2 3 4 5

  1. #include<bits/stdc++.h>
  2. //如果没有这个头文件
  3. //看这里https://blog.csdn.net/qq_41687938/article/details/116535313
  4. using namespace std;
  5. int main() {
  6. stringstream ss;
  7. vector<int> nums;
  8. string input;
  9. getline(cin, input);
  10. ss << input;
  11. int num;
  12. while (ss >> num) {
  13. nums.push_back(num);
  14. }
  15. for (auto a : nums) {
  16. cout << a << endl;
  17. }
  18. return 0;
  19. }

因为stringstream默认输出由空格分开 

2.数字由逗号分开

5,1,2,3,4,5

 

  1. #include<bits/stdc++.h>
  2. //如果没有这个头文件
  3. //看这里https://blog.csdn.net/qq_41687938/article/details/116535313
  4. using namespace std;
  5. int main() {
  6. stringstream ss;
  7. vector<int> nums;
  8. string input;
  9. getline(cin, input);
  10. ss << input;
  11. string num;
  12. while (getline(ss, num, ',')) {
  13. nums.push_back(stoi(num));
  14. }
  15. for (auto a : nums) {
  16. cout << a << endl;
  17. }
  18. return 0;
  19. }

3.数字间不止一类符号分隔

5,[1,2,3,4,5]

如果除了分隔符还有其他无关字符,就得提取出来后,自己加判断了。 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. //std::string input;//{'5',',','[','1',',','2',',','3',',','4',',','5',']'};//5,[1,2,3,4,5]
  5. getline(cin, input);
  6. std::stringstream ss(input);
  7. string str;
  8. int a;
  9. vector<int> nums;
  10. while (getline(ss, str, ',')) {
  11. if (!str.empty() && str[0] == '[') {
  12. a = stoi(str.substr(1));
  13. }
  14. else if (!str.empty() && str[str.size() - 1] == ']')
  15. a = stoi(str.substr(0, str.length() - 1));
  16. else
  17. a = stoi(str);
  18. nums.push_back(a);
  19. }
  20. for (int i = 0; i < nums.size(); i++)
  21. cout << nums[i] << ' ';
  22. return 0;
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/735989
推荐阅读
相关标签
  

闽ICP备14008679号