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

C语言指针实现字符串子串插入功能失败,求问题排查

C语言子串插入函数问题排查

你的问题不是字符串不可变导致的——你在main里用的是字符数组string[1000],属于可修改的内存区域,真正的问题出在strInsert函数的逻辑错误上,具体问题和修正方案如下:

核心错误点

  • 字符移动循环未处理字符串终止符:原循环只移动了原字符串的有效字符,没有移动末尾的'\0',会导致最终字符串无法正确终止。
  • 子串复制循环条件错误:原循环i < (int)strlen(fragment) - 1会少复制子串的最后一个字符,比如子串"world"长度为5,循环只会复制前4个字符,漏掉最后一个'd'。
  • 重复调用strlen:每次循环都调用strlen会重复遍历字符串,降低效率,且容易因字符串内容变化导致计算错误。

修正后的代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void strInsert(char string[], char fragment[], int position) {
    int len_str = strlen(string);
    int len_frag = strlen(fragment);
    // 把原字符串从插入位置开始的字符(包括终止符)向后移len_frag位
    for (int i = len_str; i >= position; i--) {
        string[i + len_frag] = string[i];
    }
    // 把子串复制到插入位置
    for (int i = 0; i < len_frag; i++) {
        string[position + i] = fragment[i];
    }
}

int main(void)
{
    char string[1000];
    char fragment[255];
    int pos;
    fgets(string, 1000, stdin);
    while (isspace(string[strlen(string) - 1]))
        string[strlen(string) - 1] = '\0';
    fgets(fragment, 255, stdin);
    while (isspace(fragment[strlen(fragment) - 1]))
        fragment[strlen(fragment) - 1] = '\0';
    scanf("%d", &pos);
    printf("Before strInsert(), Original string: [%s]\n", string);
    printf("Before strInsert(), Fragment string: [%s]\n", fragment);
    strInsert(string, fragment, pos);
    printf("After strInsert(): [%s]\n", string);
    return 0;
}

测试验证

用你给出的测试用例:

  • 原字符串输入:Hello !
  • 子串输入:world
  • 插入位置输入:6

运行后输出:

Before strInsert(), Original string: [Hello !]
Before strInsert(), Fragment string: [world]
After strInsert(): [Hello world!]

完全符合预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:03:09