0

在下面的代码中(Kernighan 和 Ritchie 的“C 编程语言”中的问题 1-17)为什么它不打印最长的行(在底部)?

#include <stdio.h>
#define MAXLINE 1000
#define LONGLINE 10

int getLineLength(char line[], int maxline){
  int i, c;

  for(i = 0; i< maxline-1 && (c = getchar() != EOF) && c != '\n'; i++)
    line[i] = c;

  if(c == '\n') {
      line[i] = c;
      i++;
  }

  line[i] = '\0';
  return i;
}



main() {
  int len;
  char line[MAXLINE];
  while((len = getLineLength(line, MAXLINE)) > 0)
    if(len > LONGLINE)
      printf("The line was over the maxlength\n\t %s", line);

  return 0;
}
4

3 回答 3

4

在您的代码中:

(c = getchar() != EOF)

这将被评估为(c = (getchar() != EOF)),给出错误的结果。你需要的是:

((c = getchar()) != EOF)
于 2011-03-30T20:00:24.563 回答
1

该程序从标准输入中读取,并打印比字符长 10 行的长消息。行以 '\n' 结尾(换行符,ENTER)。如果您输入文件(例如通过管道),输入以 EOF 结尾;如果您手动输入字符,则输入以 CTRL-C 结尾。

于 2011-03-30T19:58:15.410 回答
0

我很惊讶这完全有效。(c = getchar() != EOF)一开始是完全错误的。line[i] = c;出现两次。而且我认为它在边缘情况下容易受到缓冲区溢出的影响。

编辑:我看不到任何较早的答案说您似乎在 for 循环中缺少大括号。

于 2011-03-30T19:59:55.223 回答