C++ 输入一行数字(未知个数),对其进行解析(string分割函数 split)

笔试中如果遇到这种,特别麻烦,有时候可能会被在一些细节处出问题,现总结如下。


首先,读取一行数据,最基本的方法:

string str_line;
while (getline(fin, str_line))
{
	cout << str_line << endl;
}

1、利用“cin + getchar()”

输入一行,并以空格隔开,空格处理可以留给cin去除,getchar主要判断是否换行(输入结束),代码如下:

vector<int> vec
int num;
while (cin >> num)
{
    vec.push_back(num);
    char ch = getchar();
    if(ch == '\n')
        break;
}

eg:输入数据为1 5 6 7,vec中的数据为{1, 5, 6, 7}。

  • 一点说明:其中1、5中间有3个空格,getchar()会获取一个字符,不是换行符,现在缓冲区中剩下5 6 7,继续while,cin >> num 会自动会自动处理前面的空格,只获取最后的num。

  • 如果获取的是string,把num改为string类型就可以了。(vector的类型也需要改变)。

以上处理方法最简单,不过长时间不写,可能会存在忘记的情况。

refer:【C++ 输入一行数字或字符串(未知个数),以空格间格,换行后结束输入并输出】

2、利用“std::getline() + STL”

利用std::getline()读入一行数据到std::string,然后用std::stringfind()substr()方法进行解析,最后利用std::stoi()/ std::stol()做类型转换。针对于空格的代码为:

string str;
getline(cin, str);
vector<int> vec = split_space(str);

其中split_space定义为:

vector<int> split_short(const string &con_str)
{
    vector<int> vec;
    string str(con_str);
    while (!str.empty())
    {
        int pos = str.find(" ");
        if (pos != string::npos && pos != 0)
        {
            string temp = str.substr(0, pos);

            str = str.substr(pos + 1);

            vec.push_back(stoi(temp));
        }
        else if (pos == string::npos)
        {
            //最后一个数字
            vec.push_back(stoi(str));
            break;
        }
        else
        {
            //防止连续空格的情况
            str = str.substr(pos + 1);
        }
    }

    return vec;
}    

3、利用“istringstream = getline()”

这里的代码结构比较简单,istringstream定义于#include <sstream>文件中。

void split_getline(const string &con_str, vector<int> &vec, char delim)
{
    string token;
    std::istringstream tokenStream(con_str);
    while (getline(tokenStream, token, delim))
    {
        if(token.size() > 0) //空格时,token中为空的情况
            vec.push_back(std::stoi(token));
    }
}

refer:【How to split a string in C++ – Solution1.3】

4、通用代码(多种分隔符的情况)

如果遇到以‘,’分隔或者‘, ’(逗号+空格)等方式进行分隔,也是类似的情况,可以2中的方法可以写得更加通用一些,代码如下:

string str;
getline(cin, str);
vector<int> vec;
split_general(str, vec, ", ");
void split_general(const string &con_str, vector<int>& vec, const string &str_seperator)
{
    int len_sep = str_seperator.size();

    string str(con_str);
    int pos = 0;
    while ((pos = str.find(str_seperator)) != string::npos)
    {
        if (pos != 0)
        {
            string str_num = str.substr(0, pos);
            vec.push_back(stoi(str_num));
        }

        str = str.substr(pos + len_sep);
    }

	//解决str为空时stoi异常的问题
    if (!str.empty())
	{
		vec.push_back(stoi(str));
	}
}
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值