C语言自定义strtok()分割字符串 仅单次生效无法打印无空格结果
问题原因
你的代码有两处核心问题,导致无法正常输出所有分割后的字符串:
- 调用逻辑错误:
mystrtok()和C标准库strtok()逻辑一致,每次调用的返回值才是当前分割得到的子串起始地址。你三次调用函数后都固定传入数组首地址s给printf,没有保存函数返回的分段指针。第一次调用后s指向的位置已经被设置为结束符,内容固定为第一个片段"Let",后续调用返回的"us""split"等子串的起始地址你没有使用,自然永远打印不出后面的内容。 - 函数实现逻辑有缺陷:你写的
mystrtok()没有处理连续分隔符的场景,遍历到字符串末尾\0时没有正确把静态指针置空,会出现返回空串、分割无法正常终止的问题,和标准库的行为不匹配。
修正后的完整代码
#include <stdio.h> char *mystrtok(char *s, char delim) { static char *p = NULL; // 首次传入新字符串时,重置静态指针位置 if (s != NULL) { p = s; } if (p == NULL) { return NULL; } // 跳过当前位置所有连续的分隔符,对齐标准strtok忽略连续分隔符的行为 while (*p == delim) { p++; } // 跳过分隔符后已经到达字符串末尾,说明没有可返回的有效子串 if (*p == '\0') { p = NULL; return NULL; } char *tmp = p; // 向后遍历,直到遇到下一个分隔符或者字符串结尾 while (*p != '\0' && *p != delim) { p++; } if (*p == '\0') { // 遍历到字符串末尾,下次调用直接返回NULL p = NULL; } else { // 遇到分隔符,将其替换为字符串结束符,指针后移一位 *p = '\0'; p++; } return tmp; } int main() { char s[] = "Let us split this string"; char *token; // 第一次调用传入字符串首地址,获取第一个子串 token = mystrtok(s, ' '); // 循环获取子串直到返回NULL,说明分割完成 while (token != NULL) { printf("%s\n", token); // 后续调用传入NULL,继续分割上一次处理的字符串 token = mystrtok(NULL, ' '); } return 0; }
运行效果
编译运行后会逐行打印所有分割后的不带空格的单词,输出如下:
Let us split this string
内容的提问来源于stack exchange,提问作者Alfa Hores
相关产品推荐
相关产品推荐

