如何按序号替换字符串中的单词?C语言代码问题求助
解决指定序号单词替换为
???的问题 你的代码目前只修改了目标单词的前三个字符,核心问题是没找到目标单词的完整范围,也没处理替换后字符串的截断/前移逻辑。下面是修正后的方案:
原代码的问题点
- 定位目标单词的逻辑错误:比如输入第1个单词时,循环直接在
i=0就触发word_number==1,导致pos设为0,但后续只覆盖前三个字符,原单词剩余部分仍保留。 - 未找到目标单词的结束位置,无法完整替换整个单词。
修正后的代码
#include <stdio.h> #include <string.h> int main() { char sentence[100]; int word_number; int start_pos, end_pos; int i; printf("Enter sentence: "); fgets(sentence, 100, stdin); // 去掉fgets带来的换行符 sentence[strcspn(sentence, "\n")] = '\0'; printf("Enter word number: "); scanf("%d", &word_number); // 步骤1:定位目标单词的起始位置 start_pos = 0; // 跳过前面的单词 for (i = 0; sentence[i] != '\0'; i++) { if (sentence[i] == ' ') { word_number--; // 当word_number减到1时,下一个字符就是目标单词的开头 if (word_number == 1) { start_pos = i + 1; break; } } // 处理第一个单词的情况 if (word_number == 1 && i == 0 && sentence[i] != ' ') { start_pos = 0; break; } } // 步骤2:定位目标单词的结束位置(下一个空格或字符串结尾) end_pos = start_pos; while (sentence[end_pos] != '\0' && sentence[end_pos] != ' ') { end_pos++; } // 步骤3:替换目标单词为???,并调整后续字符位置 // 计算需要移动的字符长度:原单词结束后的所有字符长度 int move_len = strlen(sentence) - end_pos; // 将???后面的字符前移到start_pos+3的位置 memmove(sentence + start_pos + 3, sentence + end_pos, move_len + 1); // +1是包含'\0' // 写入??? sentence[start_pos] = '?'; sentence[start_pos + 1] = '?'; sentence[start_pos + 2] = '?'; printf("Result sentence: %s\n", sentence); return 0; }
关键修改说明
- 处理换行符:用
strcspn去掉fgets读取的换行符,避免后续字符串处理出错。 - 正确定位起始位置:
- 跳过前面的单词,当
word_number减到1时,下一个非空格字符就是目标单词的开头。 - 单独处理第一个单词的情况,避免漏判。
- 跳过前面的单词,当
- 定位结束位置:从起始位置开始,找到第一个空格或字符串结束符,确定目标单词的完整范围。
- 字符串移动与替换:用
memmove把目标单词后面的字符前移到???之后的位置,再写入三个?,确保原单词被完全替换。
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

