C++ 实现自己的字符串分割(split())函数

//string and  c-string

#define _CRT_SECURE_NO_WARNINGS  //用来关闭warning功能

#include <iostream>
#include <cstring>
#include <string>
#include <cstring>

using namespace std;


//未使用strcpy、strtok等函数的安全版本(strcpy_s、strtok_s)时,若未加上关闭warning的语句,则运行时会发生错误!
//关闭warning的代码: #define _CRT_SECURE_NO_WARNINGS
void string_split_0(string& str, char split_char)
{
	char* cstr = new char[str.length() + 1];
	strcpy(cstr, str.c_str());

	//c_str now contains a c-string copy of str
	/*
	* 1.c_str()返回一个指向正规C字符串的指针常量,内容与本string串相同;
	* 2.这是为了与C语言兼容,在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成c中的字符串样式。
	* 
	* 3.c_str是一个内容为字符串指向字符数组的临时指针;
	* 4.c_str返回的是一个可读不可改的常指针;
	* 注:一定要使用strcpy()函数等来操作方法c_str()返回的指针。
	*/

	char* p = std::strtok(cstr, " ");
	while (p != 0)
	{
		std::cout << p << '\n';
		p = strtok(NULL, " ");
	}

	delete[] cstr;
}


//使用strcpy_s、strtok_s函数时 遇到的问题
void string_split_1(string& str, char split_char)
{
	char* cstr = new char[str.length() + 1];

	//strcpy_s()函数有两个版本,用两个参数、三个参数都可以,只要保证缓冲区的大小即可。
	//两个参数时:
	/*
	* errno_t strcpy_s(char (&strDestination)[size], const char *strSource);
	*/
	//三个参数时:
	/*
	* errno_t strcpy_s(char& strDestination, size_t numberOfElements, const char* strSource);  //指定了长度,不易出现缓冲区大小的问题!
	*/
	//若使用new来分配存储空间时,就会出现上面说的不能保证缓冲区大小的问题了。
	strcpy_s(cstr, str.length() + 1, str.c_str());  //+1的原因:字符串结尾的‘\n’

	rsize_t len = sizeof(cstr);
	const char* delim = " ";
	char* next_token;

	//char* __cdcel strtok_s(
	//  _Inout_opt_z_  char* _String;
	//  _In_z_         char const* _Delimiter,      //Delimiter:定界符,分隔符;
	//  _Inout_ _Deref_prepost_opt_z_ char** _Context
	// );
	char* p = strtok_s(cstr, delim, &next_token);


	while (p != 0)
	{
		std::cout << p << '\n';
		p = strtok_s(NULL, delim, &next_token);
	}

	delete[] cstr;
}


int main()
{
	string str = "please split this sentence into tokens";
	string_split_0(str, ' ');
	std::cout << std::endl;
	string_split_1(str, ' ');
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值