strtok()函数使用疑问:token是否自动以NULL终止及是否需复制
strtok() 返回的 Token 是否自动以 NULL 终止?能不能直接使用?
嘿,这个问题问到点子上了——strtok 确实是 C 语言字符串处理里容易踩坑的函数,咱们一步步说清楚:
核心结论:每个 Token 会自动以 NULL 终止
strtok 的工作逻辑是直接修改你传入的原始字符串:它找到分隔符后,会把分隔符的位置替换成 \0(NULL 终止符),然后返回指向当前 Token 起始位置的指针。所以它返回的每个 Token 本身就是标准的、以 NULL 结尾的 C 字符串,完全可以直接用字符串相关函数(比如 printf、strlen)处理。
能不能直接赋值给变量使用?分情况看
这取决于你的原始字符串的生命周期和后续操作:
- 可以直接用的场景:如果原始字符串是栈上的数组(比如你例子里的
char str[80]),且这个数组在你使用 Token 的整个过程中都不会被修改、也不会超出作用域(比如不会在函数返回后还去用 Token 指针),那直接把 strtok 返回的指针赋值给变量是完全合法的。比如这段代码就没问题:char str[80] = "This is - www.tutorialspoint.com - website"; char *token = strtok(str, " -"); while (token != NULL) { printf("当前 Token:%s\n", token); // 直接用 token 完全合法 token = strtok(NULL, " -"); } - 必须复制的场景:如果你的原始字符串会被后续代码修改、或者会提前销毁(比如函数返回后,栈上的数组就失效了),那这时候不能直接保存 Token 指针——因为指针指向的是原字符串的内存,原内存失效/被修改后,Token 指针就变成野指针了。这种情况你需要用
strcpy(或更安全的strncpy)把 Token 复制到自己分配的内存里,比如:char str[80] = "This is - www.tutorialspoint.com - website"; char *saved_tokens[5]; // 假设最多存5个Token int idx = 0; char *token = strtok(str, " -"); while (token != NULL && idx < 5) { // 分配足够的内存(+1是为了存终止符) saved_tokens[idx] = malloc(strlen(token) + 1); if (saved_tokens[idx] != NULL) { strcpy(saved_tokens[idx], token); // 复制Token到新内存 } idx++; token = strtok(NULL, " -"); } // 后续就算str被修改或销毁,saved_tokens里的内容依然有效
回到你的例子
你提到的那段初始化字符串的代码,只要后续用 strtok 分割时的逻辑正确,直接使用返回的 Token 指针是合法的,不需要额外复制——前提是你只是在当前作用域内临时使用这些 Token,不会去保存指针到后续可能失效的场景。
内容的提问来源于stack exchange,提问作者bli00
相关产品推荐
相关产品推荐

