注册 登录
编程论坛 C++教室

求救 在线等

sdj501 发布于 2009-10-28 10:19, 650 次点击
#include<iostream.h>
#include<string.h>
void main(void)
{
    char buf[]="abcdefgabcgggggsdgabggabc";
    char a[]="abc";
    int flag=1,count=0,i,j;
    int m=strlen(buf),n=strlen(a);
    if(m<n)
        count=0;
    for(i=0;i<m;i++)
    {
        if(buf[i]==a[0])
        {
            for(j=0;j<n&&flag;j++)
        {
            if(buf[i+j]!=a[j])
                flag=0;
        }
        if(flag==1)
            count++;
        }
     }
    cout<<count<<endl;
}
结果为什么是2 呢?!!!
9 回复
#2
newCpp2009-10-28 11:32
你用断点执行一下你的程序应该就能够明白了吧!
我刚刚试了一下,你这个里面的第一次循环的时候
count的值会增加1
在i循环到7次的时候两个a相比较相同
然后执行了下面的If语句判断
因为for循环的时候j 都是问0开始的
所以i+j就相当于7+0和0比较这个时候
 buf[7]和a[0]的值都是a相等,
这个我自己的猜测我也不知道是不是正确的!!
#3
flyingcloude2009-10-28 11:39
#include<iostream.h>
#include<string.h>
void main(void)
{
    char buf[]="abcdefgabcgggggsdgabggabc";
    char a[]="abc";
    int flag=1,count=0,i,j;
    int m=strlen(buf),n=strlen(a);
    if(m<n)
        count=0;
    for(i=0;i<m;i++)
    {
        if(buf[i]==a[0])  
        {
            for(j=0;j<n&&flag;j++)
        {
            if(buf[i+j]!=a[j])    //abcdefgabcgggggsdgabggabc   当循环到这里时,flag被赋值为0了,此后flag一直都是0了,所以再也不会进入
                flag=0;            //    循环了。建议:应该在后面的某个恰当的位置把flag赋值1
        }
        if(flag==1)
            count++;
        }
     }
    cout<<count<<endl;
}
#4
newCpp2009-10-28 11:57
晕也对啊!但为什么我用断点的时候会发现这个只会成为1??
#5
sdj5012009-10-28 12:03
回复 3楼 flyingcloude
对的哦,我咋就没有想到呢,看来还得多多学习学习啊!!!!!
#6
qlc002009-10-28 13:15
for(i=0;i<m;i++)  
    {  
       flag=1;//在这个地方将flag置为1就可以正常输出
        if(buf[i]==a[0])   
        {  
#7
我的爱很执着2009-10-28 23:08
这样就好了
#include<iostream.h>
#include<string.h>
void main(void)
{
    char buf[]="abcdefgabcgggggsdgabggabc";
    char a[]="abc";
    int flag=1,count=0,i,j;
    int m=strlen(buf),n=strlen(a);
    if(m<n)
        count=0;
    for(i=0;i<m;i++)
    {
        if(buf[i]==a[0])
        {
            for(j=0;j<n&&flag;j++)
        {
            if(buf[i+j]!=a[j])
                flag=0;
        }
       // if(flag==1)  不能有这一行
            count++;
        }
     }
    cout<<count<<endl;
}
#8
Ckay2009-10-29 02:54
回复 7楼 我的爱很执着
那里是判断相邻的几个字符是否和第二个字符串相匹配,如果不匹配count就不自加的
#9
cookies50002009-10-29 16:23
char buf[]="abcdefgabcgggggsdgabggabc";
    char a[]="abc";

为什么等于2,很明显了吧:比较前2个abc,完全匹配,到第3个(也就是ab那儿),不能完全匹配,cut!把flag置0了,永远也翻不过来身了。。。。。后面再有N个abc,它也不管了,所以程序这玩意儿,你把开关关了,还要在适当时候再打开,否则循环10亿次也白搭。。。呵呵。支持6楼。。。

如果是这样:char buf[]="abcdefgabcggabcgggsdgabcggabc";
    char a[]="abc";
不要置flag=1了,count绝对等于5。哈哈。。。
#10
最左边那个2009-10-30 12:32
9楼说的很对!
代码从abcdefgabcgggggsdgabggabc开头开始,每遇到一次abc相连的情况,count就加1;当遇到出现a却没有bc相连的时候,就再也不会对count进行操作,那么count就保持了原有状态!
1