美文网首页
几种处理输入字符串的方法

几种处理输入字符串的方法

作者: XDgbh | 来源:发表于2018-08-12 19:16 被阅读148次

https://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html里面介绍了多种从键盘输入的函数的用法。如输入字符串分隔符可用getline(cin, str, ',');设置

0、简单的输入固定几个数字,但是又用非空格隔开,可以利用cin轻松解决

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int a1, a2, a3;
    //简单输入3个由空格或者换行符或者tab空字符隔开的数字
    cin >> a1 >> a2 >> a3;
    int b1, b2, b3;
    //要输入的3个数字要求用其他字符隔开。
    //此方法只适合用于数字间用一个其他字符隔开,多了就不行了。可用先输入保存字符串再替换字符为空格的做法。
    char ch;
    cin >> b1 >> ch >> b2 >> ch >> b3;

    cout << a1 << " " << a2 << " " << a3 << endl;
    cout << b1 << " " << b2 << " " << b3 << endl;

    return 0;
}
image.png

1、循环输入未知个数的int,空格和换行符会跳过,用vector保存。遇到其他字符会停止循环输入

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int n;
    vector<int> v_n;
    //用while循环读入未知个数的int数字,会跳过空格和换行符,遇到其他字符会结束循环
    while (cin >> n)
    {
        v_n.push_back(n);
    }

    for (int i : v_n)
    {
        cout << i << " ";
    }

    return 0;
}

2、将输入的字符串中的其他分隔字符都转换成空格,然后将新的字符串再作为一次输入(用到头文件<sstream>中的stringstream类)类对象,再用用while循环读入未知个数的int,直到非数字和空格才结束。

//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
struct part
{
    int num1;
    int num2;
    part(int i, int j) :num1(i), num2(j){}
    bool operator<(part &p)
    {
        return num1 < p.num1;
    }
};

int main()
{
    int m;
    cin >> m;
    vector<part> vp;
    //输入m后的一个换行符会影响下面的一次读入,所以可以将下面的循环多加一次,但要注意没有用到i
    for (int i = -1; i < m; i++)
    {
        string str;
        getline(cin, str);  //只会根据换行符停止接收输入
        //将str中的,;字符都换成空格
        int pos = 0;
        while (pos != string::npos)
        {
            pos = str.find(',', pos);   //未找到时会返回string::npos
            if (pos != string::npos)
            {
                str[pos] = ' ';
                pos = str.find(';', pos);
                if (pos != string::npos)
                {
                    str[pos] = ' ';
                }
            }
        }

        stringstream in_str(str);   //将字符串重新作为输入,要引入头文件<sstream>
        
        vector<int> vtemp;
        int tmp;
        //处理不定个数的数字输入
        while (in_str>>tmp)
        {
            vtemp.push_back(tmp);
        }
        for (int j = 0; j < vtemp.size(); j+=2)
        {
            vp.push_back(part(vtemp[j], vtemp[j + 1]));
        }
    }
    cout << "输出" << endl;
    for (auto v : vp)
    {
        cout << v.num1 << " " << v.num2 << endl;
    }
    return 0;
}

3、要从一串输入的字符串中分割出各个数字


如图,输入3行由逗号和分号还有换行符分隔的数字字符串,要将每对逗号分隔的数字存放在一起,再放入vector中。重点是用到C语言的<string.h>中的strtok_s(win下开发)或者strtok_r(linux下开发),来做分割。

//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<string>
#include<string.h>
using namespace std;
struct part
{
    int num1;
    int num2;
    part(int i, int j) :num1(i), num2(j){}
    bool operator<(part &p)
    {便于给容器中该类元素排序
        return num1 < p.num1;
    }
};

int main()
{
    int m;
    cin >> m;
    vector<part> vp;
    //输入m后的一个换行符会影响下面的一次读入,所以可以将下面的循环多加一次,但要注意没有用到i
    for (int i = -1; i < m; i++)
    {
        char cstr[1024];
        cin.getline(cstr, 1024);
        char *save;
        char *p = strtok_s(cstr, ",;", &save);
        vector<int> vtemp;
        while (p)
        {
            int num = atoi(p);
            vtemp.push_back(num);
            p = strtok_s(NULL, ",;", &save);
        }
        for (int j = 0; j < vtemp.size(); j+=2)
        {
            vp.push_back(part(vtemp[j], vtemp[j + 1]));
        }
    }
    cout << "输出" << endl;
    for (auto v : vp)
    {
        cout << v.num1 << " " << v.num2 << endl;
    }
    return 0;
}

相关文章

网友评论

      本文标题:几种处理输入字符串的方法

      本文链接:https://www.haomeiwen.com/subject/cwnsbftx.html