【问题标题】:While loop repeating but don't know why虽然循环重复但不知道为什么
【发布时间】:2011-12-06 11:37:33
【问题描述】:

我正在编写一个读取文本文件前 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;
}

【问题讨论】:

  • 我会避免像line = line++ 这样的陈述。使用line = line + 1line++,不要混合使用。看起来这不是您的问题,但将来可能会导致问题。
  • 这里有很多或者说错的地方,乍一看:使用c和input unitialized,第一行=0然后行=1,fname只有20个字符,如果用户输入更长的名字怎么办? , word 没用,缩进没有意义,有 if 和 else if 但没有 else
  • cinput 未初始化使用。
  • 我已经初始化C并在开始时输入? Stijn,我知道目前在格式化等方面存在很多小错误,但我需要该程序才能工作。这是我现在最关心的问题!
  • @adohertyd:查看我的编辑以获取有关问题的更新。

标签: c loops while-loop


【解决方案1】:
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

【讨论】:

  • 我也想过,但是OP说提示是打印的,所以似乎测试line == 20每二十行成功一次
  • 我通常只会使用 line++ 只是尝试不同的东西。然而问题仍然存在。
  • @Ken Wayne VanderLinde:嗯,看来你是对的......该行仅在 java 中为 0,在 C 中它可以正常工作。
  • @stijn,等等,先别开枪,我正在处理这个案子,我已经找到了他的问题。
  • 都铎王朝太棒了,非常感谢。这是一个非常不寻常的错误。这种修复会被视为“错误代码”吗?
【解决方案2】:

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

如果没有两者,你真的无法学习用 C 编写代码。

【讨论】:

  • 我们正在学习这一切。我只有 5 周的 C 编程课程。我相信我们会及时学会调试。不过谢谢
  • 现在开始自己学习使用。如果在 Linux 上,GDB 有一个很好的教程。
  • 我在 Windows 上使用 GCC 编译器
  • 如果你不能使用调试器,你可以暂时在每一行添加printf statments...比如e.g. printf("at source line %d c=%d\n", __LINE__, c);使用调试器要容易得多
  • 好吧,在这种情况下,一切似乎都正常,除了第一个循环重复而不等待用户输入。我在较长的程序中使用这些 printf 语句来查找发生错误的位置,但在这种情况下,我看不出它会在哪里实现任何目标
【解决方案3】:

你应该使用标准输入的fgets而不是scanf,你可以指定你需要读取的字符数,这样更安全。

【讨论】:

  • 我一直在其他类似性质的程序中使用 fgets,我对那个更满意,但是我们的讲师希望我们在这个特定的程序中使用 getc。我想我只是让自己变得更难了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多