//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, ' ');
}
C++ 实现自己的字符串分割(split())函数
最新推荐文章于 2025-03-02 10:44:18 发布