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

C语言字符串数组字符重排操作如何保留空格以支持原句还原

问题根因

你使用的strtok函数会直接修改输入的原字符串:它会把所有匹配的分隔符(此处为空格)替换为\0作为单词的结束标记,因此你存在mp数组里的原句经过重排处理后,所有空格都被覆盖成了空终止符,后续读取mp时自然只能读到连续无空格的内容。

修复方案

你可以先把mp中存储的原句复制到临时缓冲区做切分重排操作,不要直接修改原字符串,重排完成后再把带空格的处理结果拼接后回写即可,参考修改后的重排代码如下:

for (int rech = 0; rech < k; rech++) {
    // 先复制原句到临时缓冲区,避免破坏原始字符串的结构
    char temp_sent[1024] = {0};
    strcpy(temp_sent, mp[rech]);
    // 新建结果缓冲区存储重排后的带空格句子
    char res_sent[1024] = {0};
    int res_pos = 0;

    char *piece = strtok(temp_sent, " ");
    while (piece != NULL) { 
        char temp[20];
        char *piece2 = temp;
        
        strcpy(piece2, piece);
        int len = strlen(piece);
        // 内层变量改名避免和外层循环变量k冲突
        int k_idx = len / 2;
        int i = len;
        // 修正原代码中for循环未初始化i的问题
        for (i = len - 1; i != 0; i--) {
            piece[k_idx - 1] = piece2[i - 1];
            k_idx--;
        }
        k_idx = len / 2;
        for (i = 0;k_idx != len;i++) {
            piece[k_idx] = piece2[i];
            k_idx++;
        }
        // 拼接重排后的单词到结果缓冲区
        strcpy(res_sent + res_pos, piece);
        res_pos += len;
        // 手动补空格
        res_sent[res_pos] = ' ';
        res_pos += 1;

        piece = strtok(NULL, " "); 
    }
    // 去掉末尾多余的空格
    if (res_pos > 0) res_sent[res_pos - 1] = '\0';
    // 替换mp中存储的内容为处理后的带空格句子
    free(mp[rech]);
    mp[rech] = _strdup(res_sent);
    // 打印验证
    printf("%s\n", mp[rech]);
}

注意事项

  • 上述代码的缓冲区大小1024可以根据你实际场景的最长句子长度调整,避免字符串溢出
  • 重排后的句子已经完整带空格存储在mp数组中,后续反向还原时可以直接按空格切分单词处理即可

内容的提问来源于stack exchange,提问作者Anchr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:06:04