You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:27:15