#include <stdio.h> #include <stdlib.h> #include <string.h> // 动态分配内存以存储替换后的字符串 char* replaceSubstring(const char *str, const char *oldSubstr, const char *newSubstr) { int strLen = strlen(str); int oldLen = strlen(oldSubstr); int newLen = strlen(newSubstr); int count=0, i, j, k; char *result, *p; /**********Program**********/ //动态内存分配数组空间 result = (char *)malloc(10000); p = result;//将数组首地址赋值给一个指针变量用来操作数组 for(i=0;i<strLen;i++){//主串的下标遍历 j = 0;//子串的下标遍历 //判断当前是否找到和主串中是否和子串开头的字符 if(oldSubstr[j] != str[i]){ *p++=str[i];//直接存到新字符串 continue; } while(oldSubstr[j] != '\0' && oldSubstr[j++] == str[i++]); //如果找到和子串相同的元素 //则一一比较 一直比较到子串到结束符或者到字符不相等 if(oldSubstr[j] == '\0'){ //k为主串中子串的起始位置 k=0; while(newSubstr[k] != '\0'){ *p++ = newSubstr[k++]; } i--; }else{//只是前面几个字符匹配 后续并不匹配 则需要从头开始存 i-=j; *p++=str[i]; } } *p='\0'; /* 字符串:abcabc 需要替换的子串:a 替换后的子串:## 示例输出:##bc##bc */ /********** End **********/ return result; } int main() { char str[10000]; char oldSubstr[100]; char newSubstr[100]; char *replacedStr; // 获取用户输入 printf("【请输入原字符串:】"); fgets(str, sizeof(str), stdin); str[strcspn(str, "\n")] = 0; // 去除换行符 printf("【请输入要替换的子串:】"); fgets(oldSubstr, sizeof(oldSubstr), stdin); oldSubstr[strcspn(oldSubstr, "\n")] = 0; // 去除换行符 if (strstr(str, oldSubstr) == NULL) { printf("原字符串不包含所输入的子串。\n"); return 0; } printf("【请输入替换后的子串:】"); fgets(newSubstr, sizeof(newSubstr), stdin); newSubstr[strcspn(newSubstr, "\n")] = 0; // 去除换行符 replacedStr = replaceSubstring(str, oldSubstr, newSubstr); printf("【示例输出:】%s\n", replacedStr); // 释放动态分配的内存 free(replacedStr); return 0; }