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

这篇文章主要介绍了C++ stringstream格式化输出输入,首先string str; cinstr;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空格自动去掉,下面来看看文章的详细内容,需要的小伙伴可以参考一下

最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先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本身是没有空格的字符串

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

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;
}

输出:

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


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);
    /

本文标题为:C++ stringstream格式化输出输入详情

基础教程推荐