void xx(char *str,char *substr)
{
int tag;
int i=0;
int j=0;
while(*(str+i)!=NULL)
{
tag=1;
while(tag && *(substr+j)!=NULL)
{
if(*(str+j) == *(substr+j))
{
tag=1;
j++;
}else
{
tag=0;
j=0; //这里是造成死循环的地方,如果把它改为j++,结果肯定是不对的但至少不会成死循环
}
}
if(tag)
cnt++;
i++;
}
}
说明:中间的那个循环体和是一个死循环,例如说在对比第1个元素时就不成功则j=0,j=0说明又将对比第1个,这样又对比第1个,就成了死循环。
我对该命题的思路:
假如说i是str的元素变量应使i++向前,这样不会成死循环,字符串是有限的,i这样下去一定会到达字符末端,到时*(str+i)!=NULL这个就能使循环结束。
对于i也可以说在扫描str字符串,找与substr第1个字符相同的字符,当找到时进入第2层循环,依依进行后面的字符对比,当把substr字符串对比完且都成功时,cnt加1表示已找到一处,当从第2个循环出来时,而i续向前,而j初始化为0准备下次的对比。
你上面的tag变量的作用我不是很清楚,我想是不是类似于开关的作用呀?我的代码中不有用这个变量,把它省略了。我可能说得不是很清楚,下面代码是小弟的思路。有什么不对的地方请多多指教,都是莱鸟,一起学习吧!
//---------------------------------------------------------------------------
#pragma hdrstop
#include
int cnt=0; //定义的一个全局变量,记录substr在str中出现的次数
void xx(char *str,char *substr){
int i=0; //i为str字符串的元素变量
int j=0; //j为substr字符串的元素变量
while(*(str+i)!=NULL){ //判断str若没有则退出
while(*(str+i)==*(substr+j)){ //这是进行对比,第1个成功则对比第2个,第2个成功对比第3个依次下去
i++;
j++;
if (*(substr+j)==NULL) cnt++; // "*(substr+j)==NULL" 判断对比完没有,对比完了则说明找到一处则cnt加1,cnt是前面定义的全局变量
}
i++; //若上面对比到不成功时跳出,i继续向前
j=0; //而j则初始为0,准备下一次的对比
}
}
//---------------------------------------------------------------------------
#pragma argsused
void main(void){
xx("adfd1234 afqf a f1234afwf1234a","1234");
printf("%d\n",cnt);
getchar();
}
//---------------------------------------------------------------------------
--------------------next---------------------
阅读(1111) | 评论(0) | 转发(0) |