首页 新闻 搜索 专区 学院

求指教c代码。。。。

0
悬赏园豆:20 [已解决问题] 解决于 2015-12-29 17:25

问题是求字符串A是否为字符串B的子字符串?

#include<string.h>
int main()
{
    char A[101],B[101];
    int num[101]={0},t=0;
    scanf("%s",A);
    scanf("%s",B);
    int n=strlen(A);
    for(int i=0;A[i]!='\0';i++)
    {
        for(int j=0;B[j]!='\0';i++)
        {
            if(A[j]==B[i])
                num[t]=1;
        }
        t++;
    }
    int boolen=1;
    for(int k=0;k<n;k++)
    {
        if(num[k]!=1)
            boolen=0;
    }
    if(boolen==1)
        printf("YES");
    else
        printf("NO");
    return 0;
}
                                 我这个运行出错。

问题补充:

少复制了一行头文件。。。   加上#include<stdio.h>

Akemo的主页 Akemo | 初学一级 | 园豆:110
提问于:2015-12-29 10:25
< >
分享
最佳答案
0

楼主是刚开始学习C吗?你的代码要报错是必然的,因为语法不符合C语言规范,特指出以下两点:

1、变量定义应该放在一个函数的开头部分,不能在随意位置(比如说要开始使用的地方、代码块的中间)定义变量;

2、在for循环条件里面不能定义变量,而只能初始化变量;

至于程序的逻辑,感觉是比较混乱的,看了半天也理不清楼主的思路,所以我干脆另外给楼主写一段吧。

#include<stdio.h>
#include<string.h>
//判断字符串A是否为字符串B的子字符串
int main()
{
    char strA[101], strB[101];
    int iLenA, iLenB;
    int iLoopA, iLoopB;
    
    scanf("%s",strA);
    scanf("%s",strB);
    
    iLenA = strlen(strA);
    iLenB = strlen(strB);
    
    if(iLenA > iLenB)
    {
        printf("NO");
        return 0;
    }
    
    for(iLoopB = 0; iLenB - iLoopB >= iLenA; iLoopB++)
    {
        for(iLoopA = 0; iLoopA < iLenA; iLoopA++)
        {
            if(strA[iLoopA] != strB[iLoopB + iLoopA]) break;
        }
        
        if(iLoopA == iLenA)
        {
            printf("YES");
            return 1;
        }
    
    }
    
    printf("NO");
    return 0;
}

 

 

 

 

 

收获园豆:16
脚本王子 | 小虾三级 |园豆:779 | 2015-12-29 14:44

是初学,而且是自学 所以很煎熬。。。  谢谢你啊  我还有个问题请教     请看以下两个代码的不同之处

#include <stdio.h>
#include<string.h>
using namespace std;
int main()
{
char s[1001];
int len;
gets(s);
len=strlen(s);
int boolen=0,k;
bool judge1=false,judge2=false,judge3=false,judge4=false,judge5=false;
for(int i=0;i<len;i++)
{
if(s[i]=='s')judge1=true;
else if(judge1==true&&s[i]=='w')
judge2=true;
else if(judge2==true&&s[i]=='e'&&judge3==false)//不同之处
judge3=true;
else if(judge3==true&&s[i]=='e')
judge4=true;
else if(judge4==true&&s[i]=='t')
judge5=true;
}
if(judge1&&judge2&&judge3&&judge4&&judge5)
printf("You get love.\n");
else
printf("Your love is in the future.\n");
return 0;
}

 

#include <stdio.h>
#include<string.h>
using namespace std;
int main()
{
char s[1001];
int len;
gets(s);
len=strlen(s);
int boolen=0,k;
bool judge1=false,judge2=false,judge3=false,judge4=false,judge5=false;
for(int i=0;i<len;i++)
{
if(s[i]=='s')judge1=true;
else if(judge1==true&&s[i]=='w')
judge2=true;
else if(judge2==true&&s[i]=='e')//不同之处
judge3=true;
else if(judge3==true&&s[i]=='e')
judge4=true;
else if(judge4==true&&s[i]=='t')
judge5=true;
}
if(judge1&&judge2&&judge3&&judge4&&judge5)
printf("You get love.\n");
else
printf("Your love is in the future.\n");
return 0;
}

 

为什么第一个可以而第二个就不行啊。。

Akemo | 园豆:110 (初学一级) | 2015-12-29 17:35

有些编译器在for循环里面定义也可以的。。。我用的这个可以

Akemo | 园豆:110 (初学一级) | 2015-12-29 17:39

你要实现的功能是判断输入的字符串是否为sweet吗?代码实现方式太糟糕了,应该算是最差劲的实现方式了。就事论事,没有打击的意思,不必气馁!

还是先给你解释为什么第二种写法不行吧。比如输入的字符串就是sweet,当循环执行到第一个e的时候,judge3变成了true,若没有加上judge3==false这个判断,下一次循环时因为又是e,所以else if(judge2==true&&s[i]=='e')这个条件又是成立的,所以又执行了judge3=true,而不会执行

else if(judge3==true&&s[i]=='e')
judge4=true;

所以,judge4还是false,所以最后的结果自然不对了。

但问题是第一种写法就是正确的吗?比如输入的字符串是sweeet呢,你看看。

还有一个建议,不管你的代码写得如何,至少在每个函数的开头要有个注释,说明这个函数是干什么的,起什么作用,实现什么功能,至少要让试图给你解答的人一眼就知道你想要干什么吧。你要实现的功能都不明确说明,那怎么评断对错呢?

脚本王子 | 园豆:779 (小虾三级) | 2015-12-29 18:42

@脚本王子:谢谢指教。下次我会在旁边标注说明信息的,sweeet这种是符合题目要求的,就是只要字符串中有按顺序能找到sweet就行,无论sweet中夹杂什么。  你说还有其他比较好的实现方式,能说出一种吗,我也想开阔一下思路。

Akemo | 园豆:110 (初学一级) | 2015-12-29 23:31

@Akemo: 好的,我给你写一段,其实非常简单啦,你仔细体会一下。

 

#include <stdio.h>
#include<string.h>
//检查输入的字符串是否顺序包含(不要求连续包含)sweet的各字符
int main()
{
    char strA[] = {'s','w','e','e','t','\0'}, strB[1001];
    int iLenA = strlen(strA), iLenB;
    int iLoopA = 0, iLoopB = 0;
    
    scanf("%s",strB);
    iLenB = strlen(strB);
    
    for(; iLenB - iLoopB >= iLenA - iLoopA; iLoopB++)
    {
        if(strB[iLoopB] == strA[iLoopA])
        {
            if(++iLoopA == iLenA)
            {
                printf("The sweet is contained in the input stream.\n");
                return 1;
            }
        }
    }

    printf("The sweet is not contained in the input stream.\n");
    return 0;
}

脚本王子 | 园豆:779 (小虾三级) | 2015-12-30 09:56

@脚本王子:     for(; iLenB - iLoopB >= iLenA - iLoopA; iLoopB++)//这里没有iLoopA++??那iLoopA不会一直都是0吗?
    {
        if(strB[iLoopB] == strA[iLoopA])
        {
            if(++iLoopA == iLenA) //这步能解释一下吗?看不懂
            {
                printf("The sweet is contained in the input stream.\n");
                return 1; //为什么这里需要一个return1?不要可以吗?
            }
        }
    

Akemo | 园豆:110 (初学一级) | 2015-12-31 14:31

@Akemo: 

iLenB - iLoopB >= iLenA - iLoopA这个条件的意思是字符串B剩下的(没有检测过的)字符数比字符串A剩下的字符数要多。

 if(++iLoopA == iLenA) iLoopA不是在这里自加了,什么还会一直是0呢?

 if(++iLoopA == iLenA)

{

  ......

}

相当于

iLoopA++;

 if(iLoopA == iLenA)

{

  ......

}

 

  printf("The sweet is contained in the input stream.\n");
  return 1; //为什么这里需要一个return1?不要可以吗?

功能已经完成了,目的已经达到了,不需要再循环了,也不需要在循环外再做什么了呀,所以就返回了呀。

 

脚本王子 | 园豆:779 (小虾三级) | 2015-12-31 16:24
其他回答(2)
0

你应该把出错的信息标记出来,这样更容易看

收获园豆:1
米修君 | 园豆:553 (小虾三级) | 2015-12-29 11:38
0

大家来找茬大师!一眼看穿!

for(int j=0;B[j]!='\0';i++)
        {
            if(A[j]==B[i])
                num[t]=1;
        }

应该是j++

收获园豆:3
xingoo | 园豆:711 (小虾三级) | 2015-12-29 13:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册