在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)