【发布时间】: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...) -
在控制台应用程序中,闪烁的光标并不一定意味着它正在等待输入。您的程序不等待输入。它非常忙着转圈圈。这称为无限循环。