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

C语言中strtok的正确用法及拼接代码报错问题如何解决?

问题分析
  • strtok使用逻辑错误:strtok分割字符串的规则是首次调用传入目标字符串指针,后续迭代分割剩余内容需传入NULL作为第一个参数。你在循环内每次都传入原始str指针,导致每次都从头分割,永远只能拿到第一个单词,同时触发死循环。
  • addTo初始状态判断错误:代码中if (addTo==" ")是指针地址比较,你初始分配的bigStr是malloc得到的1字节空间(正常应该初始化为'\0',代表空字符串),和常量字符串" "的地址永远不可能相等,该分支永远不会触发,且判断逻辑完全不符合你的初始状态预期。
  • 循环条件错误:while (str != NULL)的判断无意义,str作为传入参数不会在循环内被修改,会直接触发死循环。
  • 内存与字符串操作隐患:首次malloc后未对addTo做初始化置'\0'操作,直接调用strcat会访问非法内存;长度计算未预留字符串结尾'\0'的空间,存在缓冲区溢出风险;末尾多余#的处理逻辑混乱,realloc缩容后未手动补充'\0'。
修复方案

首先要求你在初始化bigStr时必须补全初始化操作:char* bigStr = (char*)malloc(sizeof(char)*1); *bigStr = '\0';,保证初始为空字符串。

修复后的完整代码如下:

#include <string.h>
#include <stdlib.h>

char* addToStr(char* addTo, char* str,int on)
{
    if (str == NULL || addTo == NULL) {
        return addTo;
    }
    // 首次分割传原字符串,后续分割传NULL
    char* temp = strtok(str, " ");
    while (temp != NULL)
    {
        // 计算扩容长度:原有长度 + 当前单词长度 + 新增# + 结尾'\0'
        int newlength = strlen(addTo) + strlen(temp) + 2;
        addTo = (char*)realloc(addTo, newlength);
        // 追加单词和分隔符#
        strcat(addTo, temp);
        strcat(addTo, "#");
        // 取下一个单词
        temp = strtok(NULL, " ");
    }
    int current_len = strlen(addTo);
    if(on) {
        // 把末尾多余的#替换成@
        addTo[current_len - 1] = '@';
    } else {
        // 删除末尾多余的#,置结束符
        addTo[current_len - 1] = '\0';
        // 可选缩容,不影响功能
        addTo = (char*)realloc(addTo, current_len);
    }
    return addTo;
}

内容的提问来源于stack exchange,提问作者יונתן אליהו

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:36:07