xinwu 发表于 2020-4-26 13:04:55

求帮忙看一下代码

代码是关于删除字符串子串问题的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void delet(char *s1,char *s2)
{
        char *p1,*p2;
        char sc={'\0'};
        p2=s1;
        while((p1=strstr(s1,s2))!=NULL)
        {
                strncat(sc,s1,p1-p2);
                strcpy(s1,p1+strlen(s2));
                p2=s1;
        }
        strcat(sc,s1);
        printf("%s\n",sc);
}

void main()
{
        char s1,s2;
        printf("数组s:\n");
        scanf("%s",s1);
        printf("数组c:\n");
        scanf("%s",s2);
        delet(s1,s2);
}
我想问下如果此时数组s为“iamaboy”,数组c为“am”,那在delete函数 while循环里 strncat那句语句中,p1-p2不就是负数了吗,这样的话该怎么理解这个语句呢,如果可以的话能帮忙分析下while循环的过程吗{:10_254:}

sunrise085 发表于 2020-4-26 13:27:24

p1比p2大啊。
p2是s1的首地址,p1是找到子串的位置,肯定不会小于p2啊
p1-p2就是子串位置之前的字符个数。

循环的执行过程:p2指向 s1=“iamaboy”   s2=“am”
先看条件,在s1中找子串s2,,若没找到则strstr返回值为NULL,不进入循环,
若找到了,则返回从找到的第一个子串开始直到s1结尾的字符串,然后将之赋值给指针p1,这里p1指向的字符串是"amaboy"
进入循环体,第一句,拼接字符串,从s1取p1-p2个字符拼接到sc末尾,p1-p2等于1,因为p2指向s1的首地址,p1指向的是s1的第二个字符。
第二句,拷贝字符串,将从p1+strlen(s2)开始的字符串拷贝给s1,p1开始的字符串是"amaboy" ,strlen(s2)的值是2,因此p1+strlen(s2)开始的字符串是"aboy"
第三句,p2指向新的s1,开始下次循环

xinwu 发表于 2020-4-26 13:50:41

sunrise085 发表于 2020-4-26 13:27
p1比p2大啊。
p2是s1的首地址,p1是找到子串的位置,肯定不会小于p2啊
p1-p2就是子串位置之前的字符个数 ...

谢谢大神解答!刚学指针有些地方记不住,忘记了指针变量相减的含义{:10_257:},把p1,p2当成实数类型了
页: [1]
查看完整版本: 求帮忙看一下代码