1. 替换字符串
这里我们先实现替换目标串 s 中的第一个匹配的 from 串,把 pattern 串 替换成 to 字符串。
int str_replace(char s[],char from[], char to[]) {
return flag;
- 从 目标串 中匹配 from字串
// 1.从 目标串 中匹配 from字串
// strstr(m, pattern) : 从 字符串 m 中匹配pattern,返回匹配成功时的下标的地址
char *midStr = strstr(s, from);
- 声明 tail 节点,指向上图中的为字符串的首字符的地址
char *tail = (char *)malloc(len * sizeof(char));
strcpy(tail, midStr + strlen(from));
- 把 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.数组和链表
注意:
- 顺序表我们一般使用 数组 实现。
- 链表我们使用结构体实现
char str[10]; // 声明数组并分配10个连续的内存空间
// 从内存空间中,随机申请一个节点,类型是 char 型
char *str = (char *)malloc(sizeof(char))
// 如果这个结点不使用,需要手动使用 free() 释放
free(str)