我正在编写一个C程序,提示用户输入文件名,输入后显示前20行,然后等待用户输入。所以,一切都运行正常,只显示40行而不是20行,所以我将行数减少到1,而它显示了2行。我甚至尝试使用while循环而不是for循环但仍然是相同的结果。
#include <stdio.h>
int main (void)
{
FILE *in;
char file[81], buffer[81];
int flag = 1, c, i;
printf("File: ");
scanf("%s", file);
if ((in = fopen (file, "r")) == NULL) {
printf("Unable to open the file: %s\n", file);
return 1;
}
while (flag) {
for (i = 0; i < 1; i++) {
if (fgets (buffer, 80, in) != NULL) {
printf("%s", buffer);
} else {
flag = 0;
}
}
c = getchar();
if (c == (char) 'q')
flag = 0;
}
fclose (in);
return 0;
}
C的问题,Stephen G Kochan,第16章,问题6
注意:我不希望有另一种方法来解决问题,我只是想知道造成这个问题的原因。
答案 0 :(得分:2)
问题在于,您的第一个scanf("%s", file);
语句中剩余的换行符号是您getchar()
第一次收到的,因此循环运行两次而没有任何用户输入。
为了防止这种情况,请在循环前getchar()
。
除了(如评论所述),fgets (buffer, 80, in)
仅需要buffer[80]
。
scanf("%s", file);
可以像scanf("%80s", file);
一样受到保护(此处需要保留81个字节,与fgets
不同)