当我在练习册上工作时,这部分程序让我很困惑。
为什么在我交换上一个if
语句和while getchar()
时会得到相同的结果?
在这两种情况下,我首先得到句子"Enter the next title."
。在这两种情况下,我得到getchar()
秒,等待光标闪烁的输入。
在打印while(getchar()!= '\n'); continue;
之前,不应该先放puts("Enter the next title.");
首先使程序等待输入?
我的理解是它应该在循环中卡在内部直到退出条件存在,然后继续下一个语句!这是印刷品
这里首先是if语句:
while(count< MAXBKS && s_gets(library[count].title,MAXTITL) != NULL && library[count].title[0] != '\0')
{
puts("Now enter the author.");
s_gets(library[count].author,MAXAUTL);
puts("Now enter the value.");
scanf("%f", &library[count++].value);
if( count < MAXBKS) // 1 //
puts("Enter the next title.");
while(getchar()!= '\n') // 2 //
continue;
}
这里是while(getchar()..
第一个:
while(count< MAXBKS && s_gets(library[count].title,MAXTITL) != NULL && library[count].title[0] != '\0')
{
puts("Now enter the author.");
s_gets(library[count].author,MAXAUTL);
puts("Now enter the value.");
scanf("%f", &library[count++].value);
while(getchar()!= '\n') // 2 //
continue;
if( count < MAXBKS) // 1 //
puts("Enter the next title.");
}
以下是整个上下文程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 10
char * s_gets(char * st, int n);
struct book
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
int main(void)
{
struct book library[MAXBKS];
int count = 0;
int index, filecount;
FILE *pbooks;
int size = sizeof(struct book);
if ((pbooks = fopen("book.dat", "a+b")) == NULL)
{
fputs("Can't open book.dat file\n", stderr);
exit(1);
}
rewind(pbooks);
while(count< MAXBKS && fread(&library[count],size,1, pbooks) == 1)
{
if (count ==0)
puts("Current contents of book.dat:");
printf("%s by %s: $%.2f\n", library[count].title, library[count].author, library[count].value);
count++;
}
filecount = count;
if(count == MAXBKS)
{
fputs("The book.dat file is full.\n", stderr);
exit(2);
}
puts("Please add new book titles.");
puts("Press [enter] at the start of a line to stop.\n");
while(count< MAXBKS && s_gets(library[count].title,MAXTITL) != NULL && library[count].title[0] != '\0')
{
puts("Now enter the author.");
s_gets(library[count].author,MAXAUTL);
puts("Now enter the value.");
scanf("%f", &library[count++].value);
while(getchar()!= '\n')
continue;
if( count < MAXBKS)
puts("Enter the next title.");
}
if(count>0)
{
puts("Here is a list of your books:");
for(index =0; index < count; index++)
printf("%s by %s: $%.2f\n", library[index].title, library[index].author, library[index].value);
fwrite(&library[filecount],size,1,pbooks);
}
else
puts("No books? Too bad.\n");
puts("Bye.\n");
fclose(pbooks);
return(0);
}
char *s_gets(char *st, int n)
{
char *ret_val;
char *find;
ret_val= fgets(st,n,stdin);
if (ret_val)
{
find = strchr(st, '\n');
if(find)
*find = '\0';
else
while(getchar() != '\n')
continue;
}
return (ret_val);
}
答案 0 :(得分:2)
在打印
while(getchar()!= '\n'); continue;
之前,不应先让puts("Enter the next title.");
让程序等待输入吗?
不,while(getchar()!= '\n'); continue;
将清除输入缓冲区 1 ,它会
不等待用户输入。然后它将打印文本。之所以没有
等待用户输入的内容是您之前有scanf
。如果它
匹配一个浮点数,它会将其转换并保存在&library[count++].value
中,
但是换行符将保留在输入缓冲区中。这就是人们使用它的原因
清除输入缓冲区中其余部分的方法。如果它不匹配任何东西,
然后整行将保留在输入缓冲区中。
因此,首先执行哪个缓冲区并不重要
清除,您的文字将被打印。它是下一个fgets
中的s_gets()
调用哪些块并等待用户输入,而不是getchar()
。
我的理解是它应该在循环中卡在里面,直到退出条件存在, 然后继续下一个声明!这是印刷品
所以它确实如此,你很可能误解了谁阻止和等待 用户输入。
一些建议:
最好按照以下方式清除缓冲区:
int c;
while( (c = getchar()) != '\n' && c != EOF);
最好始终检查scanf
的返回值。它会回来
成功匹配令牌的数量。所以如果你期望一次转换,那么
检查scanf
是否返回1.如果不是这样,则输入错误。您
可能决定清除缓冲区并让用户再次进行重试。
1 显然,如果第一个读取代码是while(getchar() != '\n') continue;
,那么它将阻塞并等待用户输入,因为输入缓冲区将为空。但在你的情况下,输入缓冲区肯定不是空的。