鱼C论坛

 找回密码
 立即注册
查看: 526|回复: 2

[已解决]求帮忙看一下代码

[复制链接]
发表于 2020-4-26 13:04:55 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码是关于删除字符串子串问题的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void delet(char *s1,char *s2)
{
        char *p1,*p2;
        char sc[80]={'\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[80],s2[80];
        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循环的过程吗
最佳答案
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,开始下次循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,开始下次循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 13:50:41 From FishC Mobile | 显示全部楼层
sunrise085 发表于 2020-4-26 13:27
p1比p2大啊。
p2是s1的首地址,p1是找到子串的位置,肯定不会小于p2啊
p1-p2就是子串位置之前的字符个数 ...

谢谢大神解答!刚学指针有些地方记不住,忘记了指针变量相减的含义,把p1,p2当成实数类型了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 10:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表