关于C语言gets() 的问题

这个程序的主程序的循环结构中,第一次循环可以输入,但第二次循环就直接跳到lt的输入。exp仍是第一次输入的内容。为什么?#include<stdio.h>char*fin... 这个程序的主程序的循环结构中, 第一次循环 可以输入,但第二次循环就直接跳到 lt 的输入。exp仍是第一次输入的内容。为什么?
#include<stdio.h>

char* find(char *exp, char lt);

int main(void)
{
char exp[40] = {0};
char lt;
do
{
puts("please input some words.");
fgets(exp, 40 ,stdin);
puts("please input a letter.");
lt = getchar();
find(exp, lt);
}while(exp != "quit");
puts("bye");

return 0;
}

char* find(char *exp, char lt)
{
int n = 0;
while(*(exp + n) != lt && n <= 40)
n++;
if(n < 40)
{
printf("%p\n", exp + n);
return exp + n;
}
else
{
printf("NULL\n");
return " ";

}

}
没说清楚,第一次循环可以输入exp,之后就不行了
展开
 我来答
kaixingui2012
推荐于2016-12-06 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6392万
展开全部
do
{
puts("please input some words.");
fgets(exp, 40 ,stdin);
puts("please input a letter.");
lt = getchar(); //这里你输入一个字符后,按了回车,可这个回车没有消除,存在缓存中,被第二次的fgets(exp, 40 ,stdin);读去了,因此,加上一个getchar()就可以解决了
getchar(); //加这个,滤掉回车符
find(exp, lt);
}while(exp != "quit");
美食发现之路
2020-04-22 · TA获得超过3736个赞
知道大有可为答主
回答量:3061
采纳率:27%
帮助的人:233万
展开全部
简单的说,缓冲区就是内存中开辟的一块存储空间。数组也是一个缓冲区。或者你用内存操作函数自己去开辟一块内存空间也是缓冲区。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-08-22
展开全部
因为在第二次读取时,缓冲区不空,还有it=getchar();产生的字符在那里,所以程序不会等待键盘输入,面是直接从缓冲区读取字符。

解决方案(选择其中之一即可):

1、在fgets()之前加上fflush(stdin);刷新缓冲区
2、将fgets()调用改为scanf()调用或者gets()调用。
3、在原fgets()行之后加上scanf("%*[^\n]%*c");

另外,程序的退出判断也有问题,exp != "quit"不能用于判断exp字符串是否为"quit",想要达到这个目的,应该调用strcmp()函数,或者逐字符判断。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式