对于循环迭代两次预期的迭代

时间:2017-08-17 16:29:25

标签: c for-loop

我正在编写一个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

注意:我不希望有另一种方法来解决问题,我只是想知道造成这个问题的原因。

1 个答案:

答案 0 :(得分:2)

问题在于,您的第一个scanf("%s", file);语句中剩余的换行符号是您getchar()第一次收到的,因此循环运行两次而没有任何用户输入。

为了防止这种情况,请在循环前getchar()

除了(如评论所述),fgets (buffer, 80, in)仅需要buffer[80]

scanf("%s", file);可以像scanf("%80s", file);一样受到保护(此处需要保留81个字节,与fgets不同)