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
相关产品推荐
相关产品推荐

