在C,C++中实现split()分割字符串的功能

在C,C++中实现split()分割字符串的功能

最近一个朋友问到我这样一个问题:

在这里插入图片描述
就是说给定你一个字符串,需要你用逗号进行分割成多个字符串,然后输出那些分割出来的字符串中满足回文的字符串。

事实上最近已经有好多人问过我关于分割字符串的问题了,于是今天打算写一篇文章去讨论这个问题。

首先我们需要介绍一下需要用到的工具:


getline() 函数

我们之前在算法学习的5.1一章那里用到过这个函数,但是并没有做详细地介绍,事实上getline除了头文件的输入输出外,一般有两种用法(一种是头文件< istream >中输入流成员函数,一种在头文件< string >中普通函数):

第一种:

cin.getline(string,int)
cin.getline(string,int,char)

这是第一种用法的两种格式,我主要介绍一下下面一种格式:

cin就不用解释了。string表示读入到流中的字符串,int为最大能读入的字符串长度。char表示读入的定界符(一般默认为回车符,就是我们最常见的用法)。

我们来看几个例子:

在这里插入图片描述

关于定界符:

在这里插入图片描述

(我的例子总是奇奇怪怪的)

第二种:

getline(cin,string)
getline(cin,string,char)

这里的作用和上一种基本是一样的。


split() 函数实现

接下来我们就可以通过学习过的知识封装我们的函数了。

代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
typedef vector<string> SS;
//我们用一个vector去存放分割下来的字符串 
SS split_result;
void split(string x,char c){
	//我们用字符串流去处理 
	stringstream streamR(x);
	//采用getline进行输入 
	string p;
	while (getline(streamR,p,c)){split_result.push_back(p);}
} 
int main( ){
	cout<<"请输入您的字符串:";
	string s; getline(cin,s);
	cout<<"请输入您的分隔符:"; char sep;cin>>sep;
	split(s,sep);cout<<"分割下来的字符串为:\n";
	for (SS::iterator iter=split_result.begin();iter!=split_result.end();iter++) 
		cout<<"\t"<<*iter<<endl;
	return 0;
}

那能不能在C中解决这个问题呢?(不用查找)

其实也是可以的:

#include<string.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
	char p[200],x[10];
	printf("请输入您的字符串:\n");fgets(p,1000,stdin);
	printf("请输入您的分割符:\n");fgets(x,1000,stdin);
	char *q=strtok(p,x);
	while (q!=NULL){
		fputs(q,stdout);printf("\n");
		q=strtok(NULL,x);
	}
}

这里的fgets,fputs和gets,puts的功能类似,也是为了输入输出带有空格的字符串(gets没有限定空间大小不够安全,很多编译器已经把这个函数删除了)。

至于后面的strtok是string.h里的一个函数,表示对给定的字符串p,查找x将x转化为NULL(\0),即做了分割。至于后面while里面字符串的位置为什么改成了NULL,我查找了很多资料,对这里的解释都比较含糊,总结下来的意思就是第二次调用strtok的时候字符串的部分就可以用NULL代替,要获得所有的分割单元必须反复调用strtok函数。(有明白的欢迎和我交流一下,我是fw)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值