C++分割字符串,及strtok函数使用

一、使用strtok分割字符数组:

1、strtok函数原型:

char * strtok (char * str, const char * delimiters); 

①、参数str指向要分割的字符串,参数delimiters则为分割依据。当发现分割字符时,将该字符改为'\0'字符。

②、在第一次调用时,strtok()需给出参数str字符串,将字符串转换成标记。

③、往后的调用则将参数str设置成NULL。

④、每次调用成功则返回下一个分割后的字符串指针。 如果已无从分割则返回NULL。

⑤、只能以单个字符最为分割依据(可以有多个依据)。

2、代码: 

//借助strtok实现split
#include<iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[] = "Hello    Nice, to meet  ,* you";
    /*
    ** 用 空格,星号,逗号进行分割 
    ** 无论多少个,都会被当作一个key
    */
    const char* d = "  *,";   //分割依据 
    char *p;  //保存每次分割结果 
    p = strtok(s,d);      
    
    while(p)
    {
    	cout<<p<<endl;
        p=strtok(NULL,d);		   
    }
        
    return 0;
}

3、结果: 

  • 加深理解:
#include<iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[] = "Hello    Nice, to meet  ,* you";
    
    const char* d = "  *,";   //分割依据 
    char *p;  //保存每次分割结果 
    //第一次调用需参数s 
    p = strtok(s,d);    
    cout<<p<<endl;
    //后面的调用,参数为NULL 
    p=strtok(NULL,d);
    cout<<p<<endl;
    
    return 0;
}

 

二、利用find函数与substr函数,实现分割字符串:

1、两个基本函数:

①、find函数用法一: 

1)两个参数: 

size_type find( const basic_string &str, size_type index );

      str:寻找依据,即要寻找什么;

      index:从哪里开始寻找

2)一个参数:

      一个参数,默认从第一个字符开始寻找。

3)未找到则返回string::npos;

②、substr函数用法: 

basic_string substr( size_type index, size_type num = npos );

index:子串起始位置

num:子串长度

2、代码:

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

/*
*str:要分割的字符串 
*pattern:分割依据
*result:分割结果 
*/ 

//const保证不改变原串,&不用创建新的字符串 
vector<string> splitString(const string& str,const string& pattern)
{
	vector<string> result;
	//string::size_type类型,left:左边界位置  right:右边界位置 
	string::size_type left, right;
	
	right = str.find(pattern);
	left = 0;
	
	while(right != string::npos)
  	{
  		//以免字符串首部就是分割依据,压入长度为0的字符串 
  		if(right-left)
  		{
  			//压入起始位置为left,长度为(right-left)的字符串 
    		result.push_back(str.substr(left, right-left)); 
  		}	
    	left = right + pattern.size();   //右边界右移分割依据的长度,作为新的左边界 
    	right = str.find(pattern, left);   //从left这个位置开始find 
  	}
  	
  	//退出循环时,左边界不是最后一个元素 
  	if(left != str.length())
  	{
  		result.push_back(str.substr(left));
  	}
  	
  	return result;    	
}


int main()
{
	string arrA="cd ab cdcdefcdm ncd";
	string arrB="cd";
	
	vector<string> res=splitString(arrA,arrB);
	
	int len=res.size();
	for(int i=0;i<len;i++)
	{
		cout<<res[i]<<" ";
	}
	
	cout<<"END";
	return 0;
}

3、结果:

 

猜你喜欢

转载自blog.csdn.net/OpenStack_/article/details/88677806
今日推荐