| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 454 人关注过本帖
标题:一个简单程序的几句难懂的语句,广招英雄前来搭救!!!
只看楼主 加入收藏
abc594986308
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:116
注 册:2013-3-18
结帖率:82.93%
收藏
已结贴  问题点数:20 回复次数:6 
一个简单程序的几句难懂的语句,广招英雄前来搭救!!!
编写C 程序,实现以下功能:有一字符串“abcdefg123abc12345abcdefg”
(1) 统计源字符串中字符的个数;
(2) 查找子串”abc”出现的次数和每次出现的位置。


#include <stdio.h>
#include <string.h>
int main(void)
{
char *s="abcdefg123abc12345abcdefg";
char *ps="abc";
char *p;
int n=0;
puts(s);
p=strstr(s,ps);
while(p)
{
n++;
printf("第%d 次,位置%d\n",n,p-s+1);
p+=strlen(ps);/这句的功能想破了脑子,不知道他的作用/
p=strstr(p,ps);/这句更加晦涩难懂/
}
return 0;
}
ps:可能我太笨了
搜索更多相关主题的帖子: include return 字符串 include return 字符串 
2013-04-08 18:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:3 
p+=strlen(ps);/这句的功能想破了脑子,不知道他的作用/
p=strstr(p,ps);/这句更加晦涩难懂/

首先注释格式不对。。

如果我告诉你 strlen()是球指向的字符串的长度 strstr()是返回第一次出现某字符串的位置 你能知道这段代码是啥意思了不
2013-04-08 18:53
abc594986308
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:116
注 册:2013-3-18
收藏
得分:0 
回复 2楼 zklhp
还是不懂,这两个函数的功能我晓得,我就是不知道他怎么起作用的
2013-04-08 18:54
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:15 
#include <stdio.h>
#include <string.h>
int main(void)
{
char *s="abcdefg123abc12345abcdefg";
char *ps="abc";
char *p;
int n=0;
puts(s);
p=strstr(s,ps);   //这个函数是查找匹配的子字符串(在这里就是“abc”),如果没有找到完全匹配的就返回NULL,找到了就返回相应首地址给p
while(p)
{
n++;
printf("第%d 次,位置%d\n",n,p-s+1);//红色部分是拿找到相应的子串的首地址 p减去串s的首地址 s,再加 1,表示的就是子串是第几个位置,因为数组从0计数,所以加1
p+=strlen(ps);     //因为上次返回给 p 的是子串的首地址,所以要加上子串的长度,再从新的地址开始查找
p=strstr(p,ps);    //p就是代表串s的一个新位置,从这个位置继续查找ps也就是"abc",
}
return 0;
}


[ 本帖最后由 韶志 于 2013-4-8 19:16 编辑 ]

三十年河东,三十年河西,莫欺少年穷!
2013-04-08 19:14
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
我帮你把循环理一次应该就清楚了
首先、p=strstr(s,ps), 就是在"abcdefg123abc12345abcdefg"中查找"abc",显然第一个位置就是,所以返回找到的子串的首地址给 p,也就是p=&a=s;
进入循环:
1、p!=0,  n++,n=1 ,打印。。。(显然p-s+1=1);      p+=strlen(ps),所以p 的值加 3;  p=strstr(p,ps),在"defg123abc12345abcdefg"中继续查找"abc"(显然还有)
2、p!=0,    n=2    打印。。。可以数一下p和首地址之间的差距       .........     p=strstr(p,ps),在"12345abcdefg"中继续查找"abc"(显然还有)
3、p!=0     n=3    打印。。。                                      .........     p=strstr(p,ps),在"defg"中继续查找"abc"   没有了,p=null
所以循环终止


三十年河东,三十年河西,莫欺少年穷!
2013-04-08 19:28
神奈创
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:67
专家分:191
注 册:2013-3-31
收藏
得分:2 
p=strstr(s,ps);首先p是第一次出现字符窜s跟字符窜ps相同的第一个指针地址,此时p是字符窜s中的某一个指针位置,p+=strlen(ps);是跳过一个字符窜ps的长度,因为前面有‘ps’个位置是相同的,下次比较要跳过这些相同的部分,p=strstr(p,ps);是字符窜s从p这个位置开始跟字符窜ps比较。
2013-04-08 19:33
abc594986308
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:116
注 册:2013-3-18
收藏
得分:0 
回复 4楼 韶志
简单明了,一针见血,谢了!
2013-04-08 19:52
快速回复:一个简单程序的几句难懂的语句,广招英雄前来搭救!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025763 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved