虽然循环重复,但不知道为什么

时间:2011-12-06 11:37:33

标签: c loops while-loop

我正在编写一个程序来读取文本文件的前20行。当读取前20行时,用户可以选择继续读取接下来的20行或退出程序。然而,我发生了什么,它打印了20行,用户提示出现,然后它自动打印接下来的20行,而不等待用户的输入。之后,它将打印用户提示,然后等待输入。我知道这是一个简单的问题,但我没有看到它!到目前为止,根据对我的问题的回复,我对代码进行了一些修改:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
FILE *fp;
char fname[20];
char c, input;
int line;
line = 0;

    printf("Please enter the name of the file you wish to view\n");
    scanf("%s", fname);

    fp = fopen(fname, "r");

    if (fp == NULL)
    {
    printf("The file did not open correctly");
    exit(0);
    }

    else
    {
    printf("The file opened correctly\n");
    }

        while(c != EOF && input != 'q')
        {   
            c = getc(fp);
            printf("%c", c);

                if  (c == '\n')
                {
                line++;

                    while (line==20)
                    {
                    line = 0;
                    printf("Press return to view the next 20 lines or press q to quit:");
                    scanf("%c", &input);

                        if (input == 'q')
                        {               
                            return 0;
                        }

                        else if (input == '\n')
                        {
                            line++;
                        }
                    }
                }
        }
return 0;
}

3 个答案:

答案 0 :(得分:5)

line = line++;

后增量,你的线总是0.只使用:

line++;

编辑:好的,所以这不是问题。我运行你的程序,问题是当你输入文件名到第一个scanf时,按Enter键,程序读取它。由于某种原因,在第二个scanf中读取此输入(或换行符)作为输入。只需在第一个之后添加一个虚拟scanf来吸收这个换行符:

printf("Please enter the name of the file you wish to view\n");
scanf("%s", fname);
scanf("%c", &input); // dummy scanf

答案 1 :(得分:1)

最重要的是,学会启用所有警告和调试信息(在linux上,gcc -Wall -g)和学习如何使用调试器(如{{ Linux上的1}}。

如果没有两者,你真的无法在 C 中学习。

答案 2 :(得分:0)

你应该使用stdin而不是scanf的fgets,你可以指定你需要阅读的字符数量,它更安全。