c - For 循环迭代预期迭代次数的两倍

标签 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;
}

Stephen G Kochan 的 C 语言问题,第 16 章,问题 6

注意:我不希望有其他方法来解决问题,我只是想知道是什么导致了这个问题。

最佳答案

问题是您的第一个 scanf("%s", file); 语句中有一个剩余的换行符被您的第一个 getchar() 拾取时间,因此循环运行两次而无需任何用户输入。

为防止这种情况,只需在循环之前使用 getchar()

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

并且scanf("%s", file);可以像scanf("%80s", file);一样被保护(这里你需要保留81个字节, 不像 fgets)

关于c - For 循环迭代预期迭代次数的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740529/

相关文章:

c - 使基于数组的程序在没有元素的情况下工作

c++ - 私有(private) C++ 成员函数与 C 函数

r - 如何用向量运算替换双 for 循环

JavaScript for .. in 循环 IE 问题

Javascript For 循环...一个函数在另一个函数中?

c - 解释一下我的 C 代码的结果。 K&R "The C Prog language"Ex1-6

c++ - 如何解决这个编译错误

c - C语言十进制转二进制

r - 在 R 中循环获取 ChangePoint 数据

c - 这不是同一个逻辑吗?不同的结果