C++利用stringstream实现字符串分割和输入

C++利用stringstream实现字符串分割和输入

使用stringstream实现字符串转整型

int f(string s)
{
	stringstream ss;
	int n;
	ss << s;
	ss >> n;
	return n;
}

使用stringstream分割字符串

当字符串中含有空格时,或者使用getline函数读取一行字符串后进行按照空格分割成字串时,可以使用stringstream进行分割

string s = "123 456 789";
stringstream sa(s);
vector<int> v;
int word;
while (sa>>word)
{
	v.push_back(move(word));
}
for (int i = 0; i < v.size(); i++)
{
	cout << v[i] << endl;
}

输出结果:

123
456
789

配合getline函数实现分割

getline()的原型:
头文件:#include <string>

istream& getline ( istream &is , string &str , char delim );

其中:

  • istream &is 表示一个输入流,譬如cin;
  • string &str表示把从输入流读入的字符串存放在这个字符串中;
  • char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车(遇到回车停止读入)。

函数实例,对指定字符串以逗号分割:

//输入不定长字符串分割
	string a = "This,is,a,test";
	stringstream aa;
	aa << a;
	vector<string> vec;
	string temp;
	while (getline(aa,temp,','))
	{
		vec.push_back(temp);
	}
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << endl;
	}

输出结果:

This
is
a
test

对复杂字符串进行处理

//处理字串的分割,取出[]中的数作为数组
	string str="asdfa asdfgsdf aasdf[12,45,7,889,789]";
	//getline(cin, str);
	stringstream ss(str);
	vector<string> vecs;
	string temp1;
	while (getline(ss, temp1, ','))
	{
		vecs.push_back(temp1);
	}
	stringstream sts;
	for (int i = 0; i < vecs[0].size(); i++)
	{
		
		if (vecs[0][i] == '[')//处理第一个数组元素,删除前缀
		{
			for (int j = i+1; j  < vecs[0].size(); j ++)
			{
				sts << vecs[0][j];
			}
			break;
		}
	}
	//处理最后一个元素的],删除后缀
	vecs[vecs.size() - 1].pop_back();
	sts >> vecs[0];
	for (int i = 0; i < vecs.size(); i++)
	{
		cout << vecs[i] << endl;
	}

输出结果:

12
45
7
889
789

使用strtok进行字符串多个分割符分割

char *strtok(char *str, const char *delim)
  • str – 要被分解成一组小字符串的字符串。
  • delim – 包含分隔符的 C 字符串。
#include <string.h>
#include <stdio.h>
 
int main () {
   char str[80] = "This is - www.runoob.com - website";
   const char s[2] = "-";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return 0;
}

输出结果:

This is 
 www.runoob.com 
 website
void test()
{
    char str[] = "I,am,a,student; hello!world";

    const char *split = ",;!";//使用, 和 ; 和 !三种分割符进行分割
    char *p2 = strtok(str,split);
    while( p2 != NULL )
    {
        cout<<p2<<endl;
        p2 = strtok(NULL,split);
    }
}

输出结果:

I
am
a
student
 hello
world
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值