字符串替换函数的实现

1. 替换字符串

这里我们先实现替换目标串 s 中的第一个匹配的 from 串,把 pattern 串 替换成 to 字符串。

int str_replace(char s[],char from[], char to[]) {
    
    
	
	return flag;
  1. 从 目标串 中匹配 from字串
//	1.从 目标串 中匹配 from字串 
//  strstr(m, pattern) : 从 字符串 m 中匹配pattern,返回匹配成功时的下标的地址 
	char *midStr = strstr(s, from);
  1. 声明 tail 节点,指向上图中的为字符串的首字符的地址
char *tail = (char *)malloc(len * sizeof(char));
strcpy(tail, midStr + strlen(from));
  1. 把 s、to、tail连接起来
此时 s 字符串就断了,本例中只剩下 "this is \0" 
*midStr = '\0';
strcat(s, to);
strcat(s, tail);
free(tail);

全部代码:

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

/*
	strRes[] : 目标串
	from[] :   模式串(待匹配字符串) 
	to[]   :   要替换的新字符串
	
	从目标串 strRes 中匹配 from ,并把 第一次匹配成功的 from 子字符串 
	替换成 to 字符串。该算法只替换一次。 
	函数返回 int 类型:
		0 : 未找到匹配串
		1 : 找到匹配串,并已经进行替换。 
	一句话概括字符串替换:先通过字符串匹配算法,匹配到目标串s中的模式串from的位置的地址
	如果未找到则返回空,否则,我们把 模式串之前的字符串s、替换成的字符串to 和除去from串之后的尾串 
	连接起来即可。
	对于本例即是:
	 "this is one, I konw one"
	 "this is " + "two" + ", I konw one" ==> "this is two, I konw one" 
	 
*/
int str_replace(char s[],char from[], char to[]) {
    
    
	int flag=0;
	
//	1.从 目标串 中匹配 from字串 
//  strstr(m, pattern) : 从 字符串 m 中匹配pattern,返回匹配成功时的下标的地址 
	char *midStr = strstr(s, from);
//	如果midStr为空,则匹配失败	
	if(midStr == NULL) {
    
    
		return flag;
	}
	
	int len = strlen(midStr);
//	申请尾节点 
	char *tail = (char *)malloc(len * sizeof(char));
	if (tail == NULL) {
    
    
		return flag;
	}
//	2.示意图中的第二步 
	strcpy(tail, midStr + strlen(from));
	if (midStr != NULL) {
    
    
//		此时 s 字符串就断了,本例中只剩下 "this is \0" 
		*midStr = '\0';
//	3.把 s、to、tail连接起来 
		strcat(s, to);
		strcat(s, tail);
		free(tail);
		flag = 1;
	}
	return flag;
}

void main() {
    
    
	char str[40] = "this is one, I konw one";
	if(str_replace(str,"one","two")) {
    
    
		printf("%s", str);
	}
}

2.数组和链表

注意:

  1. 顺序表我们一般使用 数组 实现。
  2. 链表我们使用结构体实现
char str[10];  // 声明数组并分配10个连续的内存空间
// 从内存空间中,随机申请一个节点,类型是 char 型
char *str = (char *)malloc(sizeof(char))

// 如果这个结点不使用,需要手动使用 free() 释放
free(str)

猜你喜欢

转载自blog.csdn.net/y_h_k_666/article/details/123991833