关于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,之后就不行了 展开
#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");
展开全部
简单的说,缓冲区就是内存中开辟的一块存储空间。数组也是一个缓冲区。或者你用内存操作函数自己去开辟一块内存空间也是缓冲区。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-08-22
展开全部
因为在第二次读取时,缓冲区不空,还有it=getchar();产生的字符在那里,所以程序不会等待键盘输入,面是直接从缓冲区读取字符。
解决方案(选择其中之一即可):
1、在fgets()之前加上fflush(stdin);刷新缓冲区
2、将fgets()调用改为scanf()调用或者gets()调用。
3、在原fgets()行之后加上scanf("%*[^\n]%*c");
另外,程序的退出判断也有问题,exp != "quit"不能用于判断exp字符串是否为"quit",想要达到这个目的,应该调用strcmp()函数,或者逐字符判断。
解决方案(选择其中之一即可):
1、在fgets()之前加上fflush(stdin);刷新缓冲区
2、将fgets()调用改为scanf()调用或者gets()调用。
3、在原fgets()行之后加上scanf("%*[^\n]%*c");
另外,程序的退出判断也有问题,exp != "quit"不能用于判断exp字符串是否为"quit",想要达到这个目的,应该调用strcmp()函数,或者逐字符判断。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询