gets()函数没有执行,直接跳过了!求解释!

程序功能:编写一个函数is_within()。它接受两个参数,一个是字符,另一个是字符串指针。如果字符在字符串中,返回1,否则返回0。在一个循环语句为这个函数提供输入的完... 程序功能:编写一个函数is_within()。它接受两个参数,一个是字符,另一个是字符串指针。如果字符在字符串中,返回1,否则返回0。在一个循环语句为这个函数提供输入的完整程序中进行测试。
遇到问题:在第二次循环输入的时候第一个gets()函数语句没有被执行到!
#include<stdio.h>
#include<ctype.h>
#include<ctype.h>
int is_within(char a[],char *b);
int main()
{
char a[50]={0};
char b[50]={0};
char pd='y';
int n=0;
while((tolower(pd)=='y'))
{
printf("请输入第一个字符串!\n");
gets(a); //在第二次循环的时候直接跳过,没有被执行到!
printf("请输入第二个字符串!\n");
gets(b);
n=is_within(a,b);
if(n==1)
{
printf("找到!");
}
else
{
printf("没有找到!");
}
printf("是否继续(y/n)?\n");
//scanf("%c",&pd);
pd=getchar();
}
return 0;
}
is_within(char a[],char *b)
{
int i=0;
int m=0;
while(a[i]!='\0')
{
for(m=0;;)
{
if(a[i+m]==*(b+m))
{
m++;
//*b++;
if(*(b+m+1)=='\0')
{
return 1;
}
}
else
break;
}
i++;
}
return 0;
}
展开
 我来答
扎山尘座索礼21
推荐于2017-12-16 · TA获得超过2000个赞
知道小有建树答主
回答量:540
采纳率:100%
帮助的人:191万
展开全部
不是被跳过了,因为你在输入y之后按了一下回车,gets()函数将回车当成输入给接收了,所以会出现这样的问题,只需要在gets(a)前面加上一个getchar()即可,源代码如下:
#include<stdio.h>
#include<ctype.h>
#include<ctype.h>
int is_within(char a[],char *b);
int main()
{
char a[50]={0};
char b[50]={0};
char pd='y';
int n=0;
while((tolower(pd)=='y'))
{
printf("请输入第一个字符串!\n");
getchar();
gets(a); //在第二次循环的时候直接跳过,没有被执行到!
printf("请输入第二个字符串!\n");
gets(b);
n=is_within(a,b);
if(n==1)
{
printf("找到!");
}
else
{
printf("没有找到!");
}
printf("是否继续(y/n)?\n");
//scanf("%c",&pd);
pd=getchar();
}
return 0;
}
is_within(char a[],char *b)
{
int i=0;
int m=0;
while(a[i]!='\0')
{
for(m=0;;)
{
if(a[i+m]==*(b+m))
{
m++;
//*b++;
if(*(b+m+1)=='\0')
{
return 1;
}
}
else
break;
}
i++;
}
return 0;
}
我已经测试了,如果还有其他问题请追问
追问
谢谢,可是为什么要gets(a);在之前加一个getchar();呢?还是不太明白,可以解释下么?
追答
因为你在输入y之后,敲了一下回车,而你接收y用的是getchar();,也就是你只接收了一个字符y,而回车也算是另外一个字符,但是当前并没有程序接收他,他就会等到程序的下一个输入点,然后作为下一个输入进入程序,所以你需要在gets(a)前面添加getchar(),主要是为了接收那个在你输入y之后敲下的那个回车键,回车键在c语言里面是'\0',是被当成一个字符来处理的,一般来说,判断一个输入是否结束,往往会用'\0'字符判断,所以,要么你在接受y的地方一起接收回车,要不你就只能在gets之前接收回车,也正是因为回车在c语言里面表示一个字符,所以才会要求一般定义字符数组的时候,要多定义一位了,如果还有其他什么不明白,请继续追问
Hui翙
2015-10-30 · TA获得超过1.2万个赞
知道小有建树答主
回答量:2350
采纳率:93%
帮助的人:151万
展开全部
scanf函数输入后会多一个回车,这个回车就进入了gets里面,所以scanf后应该跟个getc来接收回车,以免影响后面的输入。
解决方法:
gets之前应该有过一次以上的输入了,此时出入流里面还有一个回车符,在gets前面加一个getchar()把那个回车符接收掉即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式