我尝试K& R练习1-16没有打印输出

时间:2017-06-21 13:16:03

标签: c string io

我正在尝试编写一个程序来读取文本文件并返回最长的行以及它的字符数。

我的主要()看起来像这样

int main(void)
{
  int len; /* current line length */
  int max; /* maximum length seen so far */
  char line[MAXLINE];      /* current input line */
  char longest[MAXLINE];   /* longest line saved here */

  max = 0;
  while ((len = getline0(line, MAXLINE)) > 0)
    if (len >= max) {
      max = len;
      copy(longest, line);
      while ((line[len] != '\n') && (line[len] != EOF)) {
        len++;
        getline0(line, len);
        copy(longest, line);
      }          
    }
  printf("%s", longest);
  return 0;
}

getline0函数如下参考;但是,它应该没有错误,因为它是从K& R的原始代码中复制的。

int getline0(char s[], int lim)
{
  int c, i;

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

复制功能(也来自K&amp; R)

/* 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;
}

但是,当我运行程序时,没有打印任何内容。为什么是这样?

1 个答案:

答案 0 :(得分:2)

  

但是,当我运行程序时,没有打印任何内容。这是为什么?

因为你打印一个空字符串!

问题是内循环:

while ((line[len] != '\n') && (line[len] != EOF)) {
  len++;
  getline0(line, len);
  copy(longest, line);
} 

即使在读取最后一行后仍会继续阅读,导致line为空,然后将其复制到longest

这就是为什么你没有看到任何打印的原因,因为打印的是一个空字符串。

完全移除内环,你会没事的。

PS:如何排查代码?

  1. 使用一些printf()查看longestline的内容 程序正在执行中。
  2. 或者,只需使用调试器。