Ste*_*ong 1 c split c-strings strtok strsep
我查看了 2 个 C 字符串函数 strtok_r() 和 strsep(),并注意到这两个函数都会修改传入的原始字符串的位置。
是否还有其他不修改传入的原始字符串的 C 字符串函数?
在我的应用程序中,原始字符串是动态分配的,因此我希望在解析完成后释放原始字符串。
strtok_r() 的示例
int main(){
char * str = strdup("Tutorial and example");
char* token;
char* rest = str;
printf("%s\n", rest);
while ((token = strtok_r(rest, " ", &rest)))
printf("%s\n", token);
printf("\n%s\n",str);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
输出
Tutorial and example
Tutorial
and
example
Tutorial
Run Code Online (Sandbox Code Playgroud)
在最后一行,我希望 str 指向未修改的 cstring“教程和示例”。
strsep() 也会出现类似的输出。
int main(){
char * str = strdup("Tutorial and example");
char* token;
char* rest = str;
printf("%s\n", rest);
while ((token = strsep(&rest, " ")))
printf("%s\n", token);
if (rest != NULL)
printf("%s\n", rest);
printf("%s\n", str);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
谢谢。
我认为你误会了strtok_r。它不会更改原始字符串的位置,而且它不能 - 函数不能更改传递给它的指针的值并使此更改对调用代码可见。
它可以并且将会做的是通过用 - 终止符替换标记来修改字符串本身的内容nul。所以回答你原来的问题:
在我的应用程序中,原始字符串是动态分配的,因此我希望在解析完成后释放原始字符串。
您不必做任何特别的事情。使用完原始字符串后,您可以而且应该释放它。
您看到Tutorial打印的单个单词只是因为下一个字符被替换为nul-terminator 并printf停在那里。如果您要逐个字符地检查字符串,您会发现它在其他方面保持不变。