C语言字符串替换

Python014

C语言字符串替换,第1张

C语言实现字符串替换函数:

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

//字符串替换函数

/********************************************************************

* Function: my_strstr()

* Description: 在一个字符串中查找一个子

* Input: ps: 源 pd:子串

* Return :0:源字符串中没有子串1:源字符串中有子串

*********************************************************************/

char * my_strstr(char * ps,char *pd)

{

char *pt = pd

int c = 0

while(*ps != '\0')

{

if(*ps == *pd)

{

while(*ps == *pd &&*pd!='\0')

{

ps++

pd++

c++

}

}else

{

ps++

}

if(*pd == '\0')

{

return (ps - c)

}

c = 0

pd = pt

}

return 0

}

/********************************************************************

* Function: memcpy()

* Description: 复制一个内存区域到另一个区域

* Input: src: 源

count: 复制字节数.

* Output: dest: 复制目的地

* Return : dest

*********************************************************************/

void * memcpy(void * dest,const void *src,size_t count)

{

char *tmp = (char *) dest, *s = (char *) src

while (count--)

*tmp++ = *s++

return dest

}

/********************************************************************

* Function: str_replace()

* Description: 在一个字符串中查找一个子串,并且把所有符合的子串用

另一个替换字符串替换。

* Input: p_source:要查找的母字符串; p_seach要查找的子字符串

p_repstr:替换的字符串

* Output: p_result:存放结果

* Return : 返回替换成功的子串数量

* Others: p_result要足够大的空间存放结果,所以输入参数都要以\0结束

*********************************************************************/

int str_replace(char *p_result,char* p_source,char* p_seach,char *p_repstr)

{

int c = 0

int repstr_leng = 0

int searchstr_leng = 0

char *p1

char *presult = p_result

char *psource = p_source

char *prep = p_repstr

char *pseach = p_seach

int nLen = 0

repstr_leng = strlen(prep)

searchstr_leng = strlen(pseach)

do{

p1 = my_strstr(psource,p_seach)

if (p1 == 0)

{

strcpy(presult,psource)

return c

}

c++ //匹配子串计数加1

printf("结果:%s\r\n",p_result)

printf("源字符:%s\r\n",p_source)

// 拷贝上一个替换点和下一个替换点中间的字符串

nLen = p1 - psource

memcpy(presult, psource, nLen)

// 拷贝需要替换的字符串

memcpy(presult + nLen,p_repstr,repstr_leng)

psource = p1 + searchstr_leng

presult = presult + nLen + repstr_leng

}while(p1)

return c

}

#define MAX 200

int main(void)

{

int i = 0

char s[MAX] ={0} //存放源字串

char s1[MAX]={0} //存放子字串

char s2[MAX]={0} //存放替换字串

char result_a[2000] = {0}//存放替换结果

char *p,*ptm,*pr

puts("Please input the string for s:")

scanf("%s",s)

puts("Please input the string for s1:")

scanf("%s",s1)

puts("Please input the string for s2:")

scanf("%s",s2)

ptm = s

pr = result_a

i = str_replace(pr,ptm,s1,s2)

printf("替换%d个子字符串\r\n",i)

printf("替换后结果:%s\r\n",result_a)

system("pause")

}

#include<stdio.h>

#include <malloc.h>

#include <memory.h>

#include <string.h>

char *replace(char *str, const char *before, const char* after)

{

if (strcmp(before, after) == 0)

return str

char *ps = str

char* tmps

int fl

while (ps = strstr(ps, before))

{

tmps = (char*)malloc(ps - str + strlen(after) + 1)

memcpy(tmps, str, ps - str)

*(tmps + (ps - str)) = 0

strcat(tmps, after)

ps += strlen(before)

tmps=(char*)realloc(tmps, strlen(tmps) + strlen(ps) + 1)

fl = strlen(tmps)

strcat(tmps, ps)

strcpy(str, tmps)

ps = str + fl

free(tmps)

}

return str

}

int main()

{

char str[200] = "1223344222333444"

printf("%s\n", replace(str, "22", "ABC"))

return 0

}

哦,不能用strstr和memcpy啊,改了下:

#include<stdio.h>

#include <malloc.h>

#include <string.h>

char* fstr(char* str, const char* subs)

{

char* t = (char*)malloc(strlen(subs) + 1)

char* ps = str

int i

int slen = strlen(subs)

*(t + slen) = 0

while (strlen(ps) >= slen)

{

for (i = 0 i < slen ++i)

{

*(t + i) = *(ps + i)

}

if (strcmp(t, subs) == 0)

{

free(t)

return ps

}

++ps

}

free(t)

return NULL

}

char *replace(char *str, const char *before, const char* after)

{

if (strcmp(before, after) == 0)

return str

char *ps = str

char* tmps

int fl,i

while (ps = fstr(ps, before))

{

tmps = (char*)malloc(ps - str + strlen(after) + 1)

for (i = 0 i < ps - str ++i)

*(tmps + i) = *(str + i)

*(tmps + (ps - str)) = 0

strcat(tmps, after)

ps += strlen(before)

tmps = (char*)realloc(tmps, strlen(tmps) + strlen(ps) + 1)

fl = strlen(tmps)

strcat(tmps, ps)

strcpy(str, tmps)

ps = str + fl

free(tmps)

}

return str

}

int main()

{

char str[200] = "1223344222333444"

printf("%s\n", replace(str, "22", "ABC"))

return 0

}

主要是for循环有问题,修改后的代码:

#include <stdio.h>

#include <string.h>

int main()

{

char src[250], pattern[250], replace[250], dst[250]

int i, j, k, l, m=0

int pattern_len, match_len

gets( src )

gets( pattern )

gets( replace )

pattern_len = strlen( pattern )

//strcpy( dst, src )

for ( i = 0src[i]i++ )

{

for ( j = 0, k = i, match_len = 0pattern[j]j++, k++ )

{

if ( pattern[j] == src[k] )

{

match_len++

}

else

{

match_len=0

break

}

}

if ( match_len == pattern_len )

{

//for ( k = 0k <ik++ )

//dst[k] = src[k]

for ( l = 0replace[l]m++, l++ )

dst[m] = replace[l]

//for ( l = i + match_lensrc[l]k++, l++ )

//dst[k] = src[l]

//dst[k] = '\0'

//break

i+=match_len-1

}

else

{

dst[m] = src[i]

m++

}

}

dst[m]='\0'

puts( dst )

return 0

}