问题是求字符串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>
楼主是刚开始学习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;
}
是初学,而且是自学 所以很煎熬。。。 谢谢你啊 我还有个问题请教 请看以下两个代码的不同之处
#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;
}
为什么第一个可以而第二个就不行啊。。
有些编译器在for循环里面定义也可以的。。。我用的这个可以
你要实现的功能是判断输入的字符串是否为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呢,你看看。
还有一个建议,不管你的代码写得如何,至少在每个函数的开头要有个注释,说明这个函数是干什么的,起什么作用,实现什么功能,至少要让试图给你解答的人一眼就知道你想要干什么吧。你要实现的功能都不明确说明,那怎么评断对错呢?
@脚本王子:谢谢指教。下次我会在旁边标注说明信息的,sweeet这种是符合题目要求的,就是只要字符串中有按顺序能找到sweet就行,无论sweet中夹杂什么。 你说还有其他比较好的实现方式,能说出一种吗,我也想开阔一下思路。
@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;
}
@脚本王子: 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:
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?不要可以吗?
功能已经完成了,目的已经达到了,不需要再循环了,也不需要在循环外再做什么了呀,所以就返回了呀。
你应该把出错的信息标记出来,这样更容易看
大家来找茬大师!一眼看穿!
for(int j=0;B[j]!='\0';i++) { if(A[j]==B[i]) num[t]=1; }
应该是j++