首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

急fun函数的功能如何去实现字符串替换的啊求详解

2012-04-07 
急急急急,fun函数的功能怎么去实现字符串替换的啊?求详解。#includestdio.h#includestring.hvoid fun (

急急急急,fun函数的功能怎么去实现字符串替换的啊?求详解。
#include <stdio.h>
#include <string.h>
void fun (char *s, char *t1, char *t2 , char *w)
{
  char *p , *r, *a;
  strcpy(w, s);
  while (*w)
  {p = w; r = t1;
/************found************/
  while (*r)
  if (*r == *p) {r++; p++;}
  else break;
  if (*r == '\0')
  {a = w; r = t2;
  while (*r){
/************found************/
  *a = *r; a++; r++;
  }
  w += strlen(t2);
  }
  else w++;
  }
}
main()
{
  char s[100], t1[100], t2[100], w[100];
  printf("\nPlease enter string S:"); scanf("%s", s);
  printf("\nPlease enter substring t1:"); scanf("%s", t1);
  printf("\nPlease enter substring t2:"); scanf("%s", t2);
  if (strlen(t1)==strlen(t2)) {
  fun(s, t1, t2, w);
  printf("\nThe result is : %s\n", w);
  }
  else printf("Error : strlen(t1) != strlen(t2)\n");
}
求解fun函数部分思路字符串替换思路?最后每句诠释。

[解决办法]
while (*r)if (*r == *p) {r++; p++;}else break;//这个while是找w中第一个与t1匹配的字串
if (*r == '\0')//这个判断条件成立的话,说明找到字串
{a = w; r = t2;
while (*r){*a = *r; a++; r++;}//如果找到字串,用t2替换
w += strlen(t2);//w前进到找到字串的最后一个位置
else w++;//如果没有找到,前进一个字符
[解决办法]
楼主你代码给你整理下吧:

C/C++ code
void fun (char *s, char *t1, char *t2 , char *w){    char *p , *r, *a;    strcpy(w, s);    while (*w)    {        p = w;         r = t1;        while (*r)        {            if (*r == *p)             {                r++;                 p++;            }            else                 break;        }        if (*r == '\0')        {            a = w;             r = t2;            while (*r)            {                *a = *r;                 a++;                 r++;            }            w += strlen(t2);        }        else             w++;    }}
[解决办法]
LZ,字符串替换一般是实用其他一些功能函数实现的,除非特殊情况,没必要手工实现

int index(string sub) // 定位子串
int strlen(string s) // 取字符串长
void strdel(string s,int begin,int end) // 删除指定区间字符
void strinsert(int pos,string s1,string s2) // 再某位置插入字符串

void fun(string s1,string s2,string s3)
{
int p = index(s2);
strdel(s1,p,p+strlen(s2));
strinsert(p,s1,s3);
}
[解决办法]
当s所指字符产中的内容为abcdabfab,t1所指子串中的内容为ab,t2所指子串中的内容为99时,结果:
就按照这个给你讲一下
首先char *s= "abcdabfab";char *t1= "ab";char *t2= "99";w是空的
1.刚进入函数,strcpy的作用是拷贝,令w = "abcdabfab";(注:这儿不是简单的相等因为w的首地址不等于s的首地址)
2.while外循环(作用:遍历所有w中的字符)
p = w; //令p="abcdabfab";且p的首地址等于w的首地址
r = t1;//令r="ab";且r的首地址等于t1的首地址
3.while内循环(作用:查找与t1相同的子串)
1)if此时r指向a,而p指向的也是a,所以*r=*p,然后r++;p++(r、p的地址++,指向下一个元素)此时*r=*p="b";成立,然后r++;p++,此时*r = NULL,所以while循环跳出
2)if循环,此时*r == '\0'成立,
[解决办法]
C/C++ code
void fun (char *s, char *t1, char *t2 , char *w){    char *p , *r, *a;    strcpy(w, s);    while (*w)    {        p = w;         r = t1;        while (*r)//开始遍历r中的每个字符        {            if (*r == *p) //相等r和p指针各+1            {                r++;                 p++;            }            else //不相等直接跳出循环                break;        }        if (*r == '\0')//如果是跳出循环这里必不成立,否则就是在p中找到了匹配的字符串        {            a = w; //这里使用w是因为w指针未变动            r = t2;            while (*r)//挨个赋值            {                *a = *r;                 a++;                 r++;            }            w += strlen(t2);//赋值成功后w指针往后移动strlen(t2)个位置        }        else //匹配循环由break跳出,所以指针w往后移动一位,继续重复上述动作(对于较长的字串用kmp算法较好一些)            w++;    }} 


[解决办法]
在赋值循环前不是有一句a=w吗?所以*a=*r就相当于*w=*r
但是你要明白的是w这个指针所指向的内存位置再每次大的循环过后
会变化,若找到字符串则往后移动strlen(t2),否则往后移动1。
如果还不明白还是回去看看指针吧。

热点排行