【问题标题】:Learning C - why does my command line ask for input. I do not have a getchar()学习 C - 为什么我的命令行要求输入。我没有 getchar()
【发布时间】:2021-02-12 10:36:05
【问题描述】:

嘿,我正在学习 C 并尝试从文件中打印最长的行。 我正在使用 ANSI C 书中的代码。 我不明白为什么,当我运行代码时,命令行似乎在等待输入。据我所知,我没有 getchar() 或其他输入函数。

这里是代码。有一个main函数和另外两个函数

#include <stdio.h>
#define MAXLINE 1000        /*Maximum input line size*/

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/*Print longest input line*/

    main()
    {
        FILE *fpointer;
        int len;                /*current line length*/
        int max;                /*maximum lenght seen so far*/
        char line[MAXLINE];     /*current input line*/
        char longest[MAXLINE];  /*longest line saved here*/
        
        
        if ((fpointer=fopen("arrays.c", "r")) == NULL) {
            printf("Error opening file");
            return 1;
        }
        fgets(line, MAXLINE, fpointer);
        max = 0;
        while ((len = getline(line, MAXLINE)) > 0) {
            if (len > max) {
                max = len;
                copy(longest, line);
            }
            fgets(line, MAXLINE, fpointer);
        }
        if (max > 0)            /*There was a line*/
            printf("%s", longest);
        return 0;
    }

/*getline: read a line into s, return length*/

    int getline(char s[], int lim) 
    {
        int c, i;
    
        for (i=0; i<lim-1 && c != '\n'; ++i) {
            s[i] = c;
        }
        if (c == '\n') {
            s[i] = c;
            ++i;
        }
        s[i] = '\0';
        return i;
    }

/*copy: copy 'from' into 'to'; assume to is big enough*/

    void copy(char to[], char from[])
    {
        int i;
    
        i = 0;
        while ((to[i] = from[i]) != '\0')
            ++i;
    }

【问题讨论】:

  • 如何你运行你的程序?你如何建造它?您使用什么环境来创建程序?什么操作系统?
  • 可能不是问题的根源,但仍然是错误的:c != '\n's[i] = c 是未定义的行为,因为从未设置过 c
  • 针对您的实际问题 - 进行基本调试。使用调试器,它可以立即告诉您程序“卡”在哪里。甚至在代码中添加调试打印语句也可以完成这项工作。也就是说,您可以做更多的事情来自己发现或至少缩小问题范围。
  • 循环永远不会结束。我希望您打算检查 fgets(line, MAXLINE, fpointer) 是否返回 EOF(在您的循环内),然后离开循环?或者如果fgets 没有读取任何内容,则确保getline(line, MAXLINE) 返回0? (不要以为 EOF 是 \0...)
  • 在控制台应用程序中,闪烁的光标并不一定意味着它正在等待输入。您的程序不等待输入。它非常忙着转圈圈。这称为无限循环。

标签: c file printing


【解决方案1】:

问题是你没有检查fgets的返回值。当可以读取某些内容时,它会在将输入复制到那里后返回其缓冲区,并在文件结束时返回 NULL 并保持缓冲区不变

因此,getline 将永远不会返回 0,并且您有一个无限循环。

但这还不是全部,getline 是完全错误的。如所写,如果 意外 c 的初始值不是 \n 或 0,它将始终返回 999 (lim - 1)。

最小的修复:

    ...
    if (NULL == fgets(line, MAXLINE, fpointer)) return 0;  // immediately stop if file is empty
    max = 0;
    while ((len = getline(line, MAXLINE)) > 0) {
        if (len > max) {
            max = len;
            copy(longest, line);
        }
        if (NULL == fgets(line, MAXLINE, fpointer)) break;  //exit loop on EOF
        ...
int getline(char s[], int lim)
{
    int c, i;

    for (i=0; i<lim-1 && (c = s[i]) != '\n'; ++i);
    ...

【讨论】:

    猜你喜欢
    • 2021-03-12
    • 2022-09-30
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多