关于C语言gets() 的问题

这个程序的主程序的循环结构中, 第一次循环 可以输入,但第二次循环就直接跳到 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,之后就不行了

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");

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-04-22
简单的说,缓冲区就是内存中开辟的一块存储空间。数组也是一个缓冲区。或者你用内存操作函数自己去开辟一块内存空间也是缓冲区。
第2个回答  2015-08-22
因为在第二次读取时,缓冲区不空,还有it=getchar();产生的字符在那里,所以程序不会等待键盘输入,面是直接从缓冲区读取字符。

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

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

另外,程序的退出判断也有问题,exp != "quit"不能用于判断exp字符串是否为"quit",想要达到这个目的,应该调用strcmp()函数,或者逐字符判断。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网