Files
2025-02-25 08:58:39 +08:00

83 lines
2.0 KiB
C

#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;
}