C++ stringstream格式化输出输入详情

时间:2022-04-21 14:07:09

最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空格自动去掉,只要不讲cin和getline混用即可。

 cin.getline(s,k);

接收一行中k个字符,可以接收空格
cin.getline()实际有三个参数,cin.getline(字符串,接收个数,结束字符);
当第三个参数省略时,系统默认为 '\0' ;

 getline(cin,s);

和cin.getline()类似,读入一行字符串,值得注意的是cin.getline()属于istream流,而getline()属于string流,二者并不相同。

StringStream

这个东西单独讲,比较重要,包含在sstream库中。

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

然后stringstream的作用就是从string对象读取字符或字符串。

 

string s = "ABCD";
  stringstream ss(s);
  char ch;
  while(ss>>ch){
      cout << ch << " ";
  }

  //运行结果
  //A B C D

又例如:

string s = "hello world";
  stringstream ss(s);
  string str;
  while(ss>>str){
      cout << str << " ";
  }

  //运行结果
  //hello world

在某些题目需要处理字符串时,这些题目往往是输入的一行中包含多个字符以及空格,这个时候就可以利用 stringstream进行单个字符或者单个字符串分析处理了

例子程序:

int main()
{

  string line;
  int k = 1;
  cout << "===============case1================" << endl;;
  while (getline(cin, line)) //可与读到包含空格, ;等字符;但是在ss>>x时被截断
  {
      int sum = 0, x;
      stringstream ss(line);
      while (ss >> x)
      {
          sum += x;
      }
      cout << "the sum is :" << sum << endl;
      ++k;
      cout << endl;
      cout << "===============case" << k << "================" << endl;;
  }

  return 0;
}

-输出:

===============case1================
1 2 3 4 5
the sum is :15

===============case2================
1,2,3,4,5
the sum is :1

===============case3================
1 a 2 b 3
the sum is :1

===============case4================
a 1 1 1 1
the sum is :0

===============case5================

另外一组:

int main()
{

  string line;
  int k = 1;

  cout << "===============case1================" << endl;;
  while (getline(cin, line))
  {
      string out, x;
      stringstream ss(line);
      while (ss >> x)
      {
          cout << x << ";";
      }
      ++k;
      cout << endl;
      cout << "===============case" << k << "================" << endl;;
  }

  return 0;
}

输出:

===============case1================
this is very good!
this;is;very;good!;
===============case2================
this,is,very,good!
this,is,very,good!;
===============case3================

实验矩阵类型的输入:

3

0 1 2

2 3 4

5 6 7

int main()
{

  string line;
  int k = 1;
//测试矩阵形式的输入:
  string input;
  int n;
  //cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
  getline(cin, input);
  stringstream ss(input);
  ss >> n;
  
  vector<vector<int> > vec;
  for (int i = 0; i < n;i++)
  {
      getline(cin,input); //会将换行符当做一行
      stringstream ss(input);
      int x;

      vector<int> temp;
      while (ss>>x) //只能以空格处理分离
      {
          temp.push_back(x);
      }
      vec.push_back(temp);
  }


  return 0;
}

使用方法:

  • input1是没有空格的,带有,;将矩阵的行列分出来;
  • 但是使用cin>>k后,没有使用getline(input1), 应为input1本身是没有空格的字符串

C++ stringstream格式化输出输入详情

经上面启发:练习这样的输入:

3 3
0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1

测试代码:

int main()
{

  string line;
  int k = 1;

  int row, col;
  getline(cin, line);
  stringstream ss(line);
  ss >> row >> col;
  getline(cin, line); //第二行
  stringstream s(line);
  string temp1, temp2, temp3;;
  vector<pair<pair<int,int>,pair<int,int>>> vec;
  while (getline(s, temp1, ';'))
  {
      vector<pair<int, int>> pair1;
      stringstream s3(temp1);
      while (getline(s3, temp2,' ')) //以换行符结束,中间为空格
      {
          pair<int, int> pair2;
          stringstream s4(temp2);
          vector<int> res;
          while (getline(s4, temp3, ','))
          {
              res.push_back(stoi(temp3));
          }
          pair2.first = res[0];
          pair2.second = res[1];

          pair1.push_back(pair2);
      }

      vec.push_back(make_pair(pair1[0],pair1[1]));
  }


  return 0;
}

输出:

C++ stringstream格式化输出输入详情

另外参考输入遇到过问题题解:

5 0
1 2 3
0 4
0 4
0 4
1 2 3

int main()
{
  int N, id;
  string str;
  getline(cin, str);
  stringstream ss(str);
  ss >> N >> id;

  vector<vector<int>> vec;
  //for (int i = 0; i < N; i++)
  //{
  //  vector<int> temp;
  //  int user;
  //  getline(cin, str);
  //  stringstream s(str);
  //  while (s>>user) //以空格进行划分
  //  {
  //      temp.push_back(user);
  //  }
  //  vec.push_back(temp);
  //}

  while (getline(cin, str)) //其实可都可以不知道行数
  {
      vector<int> temp;
      int user;
      stringstream s(str);
      while (s >> user)
      {
          temp.push_back(user);
      }
      vec.push_back(temp);
  }

  cout << recommendFriends(vec, id) << endl;

  return 0;
}

int test()
{
  //int N,id;
  //cin >> N >> id; //直接输入用户数和需要查找的用户id ; 这样就会产生换行符

  int N;
  vector<int> in;
  char c;
  while ((c = cin.get()) != '\n')
  {
      cin.unget();
      cin >> N; 
      in.push_back(N);
  }
  
  vector<vector<int>> vec;
  for (int i = 0; i < in[0]; i++)
  {
      vector<int> temp;
      int user;
      
      while ((c=cin.get())!= '\n') //文件结果没有换行符了,所以陷入死循环
      {
          cin.unget();
          cin >> user;
          temp.push_back(user);
      }
      if (temp.size()!=0)
      {
          vec.push_back(temp);
      }
      
  }

  cout << recommendFriends(vec, in[1]) << endl;

  return 0;
}

全部代码:

#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <unordered_set>

#include<sstream>
#include<fstream>
using namespace std;

#define cin infile //一定不能再oj系统中,有错,导致超时等!!!
//C++文件输入
ifstream infile("ini.txt", ifstream::in);


//函数功能:将输入字符串s,以字符串c(;)进行拆分,拆分结果放在v中
//函数参数说明:s为输入字符串;c为拆分的字符串;v为拆分结果
//函数返回值:正常返回0
int split_string(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
  std::string::size_type pos1, pos2;
  pos2 = s.find(c);
  pos1 = 0;
  while (std::string::npos != pos2)
  {
      v.push_back(s.substr(pos1, pos2 - pos1));

      pos1 = pos2 + c.size();
      pos2 = s.find(c, pos1);
  }
  if (pos1 != s.length())
      v.push_back(s.substr(pos1));
  return 0;
}

int main()
{

  string line;
  int k = 1;
  /*cout << "===============case1================" << endl;;
  while (getline(cin, line))
  {
      int sum = 0, x;
      stringstream ss(line);
      while (ss >> x)
      {
          sum += x;
      }
      cout << "the sum is :" << sum << endl;
      ++k;
      cout << endl;
      cout << "===============case" << k << "================" << endl;;
  }*/

  //cout << "===============case1================" << endl;;
  //while (getline(cin, line))
  //{
  //    string out, x;
  //    stringstream ss(line);
  //    while (ss >> x)
  //    {
  //        cout << x << ";";
  //    }
  //    ++k;
  //    cout << endl;
  //    cout << "===============case" << k << "================" << endl;;
  //}

  ////测试矩阵形式的输入:
  //string input;
  //int n;
  ////cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
  //getline(cin, input);
  //stringstream ss(input);
  //ss >> n;
  //
  //vector<vector<int> > vec;
  //for (int i = 0; i < n;i++)
  //{
  //    getline(cin,input); //会将换行符当做一行
  //    stringstream ss(input);
  //    int x;
  //    vector<int> temp;
  //    while (ss>>x) //只能以空格处理分离
  //    {
  //        temp.push_back(x);
  //    }
  //    vec.push_back(temp);
  //}

  int row, col;
  getline(cin, line);
  stringstream ss(line);
  ss >> row >> col;
  getline(cin, line); //第二行
  stringstream s(line);
  string temp1, temp2, temp3;;
  vector<pair<pair<int,int>,pair<int,int>>> vec;
  while (getline(s, temp1, ';'))
  {
      vector<pair<int, int>> pair1;
      stringstream s3(temp1);
      while (getline(s3, temp2)) //以换行符结束,中间为空格
      {
          pair<int, int> pair2;
          stringstream s4(temp2);
          vector<int> res;
          while (getline(s4, temp3, ','))
          {
              res.push_back(stoi(temp3));
          }
          pair2.first = res[0];
          pair2.second = res[1];

          pair1.push_back(pair2);
      }

      vec.push_back(make_pair(pair1[0],pair1[1]));
  }


  return 0;
}

到此这篇关于C++ stringstream格式化输出输入详情的文章就介绍到这了,更多相关C++ stringstream格式化输出输入内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/ranjiewen/p/9463676.html