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

如何按序号替换字符串中的单词?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;
}

关键修改说明

  1. 处理换行符:用strcspn去掉fgets读取的换行符,避免后续字符串处理出错。
  2. 正确定位起始位置:
    • 跳过前面的单词,当word_number减到1时,下一个非空格字符就是目标单词的开头。
    • 单独处理第一个单词的情况,避免漏判。
  3. 定位结束位置:从起始位置开始,找到第一个空格或字符串结束符,确定目标单词的完整范围。
  4. 字符串移动与替换:用memmove把目标单词后面的字符前移到???之后的位置,再写入三个?,确保原单词被完全替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:12