一,相同点
strtok和 strsep 都可以按指定字符截取字符串
例如:字符串 “123,b,cd,4567”,这种字符串,如果使用逗号截取,就会分割成自己想要的字符串
二,strtok的用法
第一次调用时,需要将第一个参数设置为要分割的字符串,之后的调用中应将第一个参数设置为NULL,
以便从上次分割的位置继续分割。第二个参数古要传入分割符的指针。每次调用strtok时,它返回指向下一个子串的指针。当没有更多的子串可供返回时,函数返回NULL
.
strtok会改变原始字符串的值,因为每次调用这个方法他会将分隔符改为\0,然后指向下一个位置
例如:
char *token = strtok("abc,def,ghi", ",");
while (token != NULL) {
// 使用token进行后续处理
token = strtok(NULL, ","); // 继续从上次的位置分割
}
三,strsep的用法
第一个参数需要传入字符串指针的指针,第二个参数传入分隔符的指针。调用的时候每次循环调用的时候都会返回下一个字符串的指针没有的时候返回NULL,与strtok的调用区别是,他每次调用第一个参数都传入的是要分割的字符串指针的指针,而strtok第一次是指针,后面串入的是NULL
四,分割符如果向量,区别是什么
但是但是对于分隔符相连,但是中间没有数组的情况下,strttok会跳过strsep则不会
五, strttok截取分割符相连这种情况的字符串,举例说明
void test_strtoken()
{
char *pp[30] ={0};
int param_count=0;
char pchar [] = "123,b,cd,4567,,uyyyt,yy";
char *token;
const char *delim = ",";
token = strtok(pchar, delim);
pp[param_count] = token;
printf("pp[%d] %s\r\n",param_count,pp[param_count]);
// 通过循环不断获取分割后的子字符串
while ((token = strtok(NULL, delim)) != nullptr) {
if(token != NULL)
{
param_count++;
pp[param_count] = token;
printf("pp[%d] %s\r\n",param_count,pp[param_count]);
}
else
{
printf("token is null \r\n");
}
}
}
对于上面的方法,打印出来的结果是:
pp[0] 123
pp[1] b
pp[2] cd
pp[3] 4567
pp[4] uyyyt
pp[5] yy
可以看出来完全忽略了 4567后面两个逗号之间没有数据的情况,直接跳过了
六, strsep 截取分割符相连这种情况的字符串,举例说明
如果我们使用 strsep ,应该如何实现举例如下:
void test_strsep()
{
char *pp[30] ={0};
int param_count=0;
char pchar [] = "123,b,cd,4567,,uyyyt,yy";
char *token;
const char *delim = ",";
char *str = pchar;
// 通过循环不断获取分割后的子字符串
while ((token = strsep(&str, delim)) != nullptr) {
if(token != NULL)
{
pp[param_count] = token;
printf("pp[%d] %s\r\n",param_count,pp[param_count]);
param_count++;
}
else
{
printf("token is null \r\n");
}
}
}
此时会打印如下结果:
pp[0] 123
pp[1] b
pp[2] cd
pp[3] 4567
pp[4]
pp[5] uyyyt
pp[6] yy
这个时候会打印出 4567后面两个逗号没有值的情况,对于某些业务需要按顺序赋值的情况就不会出错了,建议使用strsep