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

