如何解决学习 C - 为什么我的命令行要求输入我没有 getchar()
嘿,我正在学习 C 并尝试从文件中打印最长的行。 我正在使用 ANSI C 一书中的代码。 我不明白为什么,当我运行代码时,命令行似乎在等待输入。据我所知,我没有 getchar() 或其他输入函数。
这是代码。有一个主函数和两个其他函数
#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,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;
}
解决方法
问题是你没有检查fgets
的返回值。当可以读取某些内容时,它会在将输入复制到那里后返回其缓冲区,并在文件末尾返回 NULL 并使缓冲区保持不变。
因此,getline
永远不会返回 0,您将陷入无限循环。
但这还不是全部,getline
显然是错误的。如所写,如果 意外 lim - 1
的初始值不是 c
否则为 0,它将始终返回 999 (\n
)。
最小修复:
...
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,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);
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。