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

//string and  c-string#define _CRT_SECURE_NO_WARNINGS  //用来关闭warning功能#include 
#include 
#include 
#include 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, ' ');
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部