练习1-16:修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本(C程序设计语言 第2版)

该书英文配套答案
Answer to Exercise 1-16, page 30
Revise the main routine of the longest-line program so it will correctly print the length of arbitrarily long input lines, and as much as possible of the text.

 
/* This is the first program exercise where the spec isn't entirely
 * clear. The spec says, 'Revise the main routine', but the true
 * length of an input line can only be determined by modifying
 * getline. So that's what we'll do. getline will now return the
 * actual length of the line rather than the number of characters
 * read into the array passed to it.
 */
 
#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 */
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 = getline(line, MAXLINE)) > 0)
  {
    printf("%d: %s", len, line);
 
    if(len > max)
    {
      max = len;
      copy(longest, line);
    }
  }
  if(max > 0)
  {
    printf("Longest is %d characters:
%s", max, longest);
  }
  printf("
");
  return 0;
}
 
/* getline: read a line into s, return length */
int getline(char s[], int lim)
{
  int c, i, j;
 
  for(i = 0, j = 0; (c = getchar())!=EOF && c != '
'; ++i)
  {
    if(i < lim - 1)
    {
      s[j++] = c;
    }
  }//这里getline修改后,i可以大于lim限制,只计数,不保存字符。
  if(c == '
')
  {
    if(i <= lim - 1)
    {
      s[j++] = c;
    }
    ++i;
  }
  s[j] = '';
  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]) != '')
  {
    ++i;
  }
}
View Code
原文地址:https://www.cnblogs.com/yangshuo/p/3328914.html