首页 > 其他 > 详细

c程序设计语言_习题1-16_自己编写getline()函数,接收整行字符串,并完整输出

时间:2014-04-07 11:25:56      阅读:477      评论:0      收藏:0      [点我收藏+]

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.

bubuko.com,布布扣
/* 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); //自己编写getline()函数,接收整行字符串
void copy(char to[], char from[]); //和c语言库函数strcpy()实现同样的功能。

/* 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:\n%s", max, longest);
  }
  printf("\n");
  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 != \n; ++i)
  {
    if(i < lim - 1)
    {
      s[j++] = c;
    }
  }
  if(c == \n)
  {
    if(i <= lim - 1)
    {
      s[j++] = c;
    }
    ++i;
  }
  s[j] = \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;
  }
}
bubuko.com,布布扣

 


Chris Sidi, however, was not convinced - he thought this answer was "too easy", so he checked with bwk, who agreed. Chris writes: "Looks like Mr. Kernighan meant for "main routine" in Exercise 1-16 to refer to function main(), saying your solution of modifying getline() is "too easy." :) (Though I think your solution shouldn‘t be removed from the Answers web site, just complimented with another one that only modifies main())"

Cue Mr "386sx", riding to the rescue on a white horse...

bubuko.com,布布扣
/* Exercise 1-16 */

#include <stdio.h>

#define MAXLINE 20

int getline(char s[], int lim);
void copy(char to[], char from[]);

int main(void)
{
    char line[MAXLINE];
    char longest[MAXLINE];
    char temp[MAXLINE];
    int len, max, prevmax, getmore;
    
    max = prevmax = getmore = 0;
    while((len = getline(line, MAXLINE)) > 0)
    {
     //蛋疼啊,不写注释,看不懂。
if(line[len - 1] != \n) { if(getmore == 0) copy(temp, line); prevmax += len; if(max < prevmax) max = prevmax; getmore = 1; } else { if(getmore == 1) { if(max < prevmax + len) { max = prevmax + len; copy(longest, temp); longest[MAXLINE - 2] = \n; } getmore = 0; } else if(max < len) { max = len; copy(longest, line); } prevmax = 0; } }
if(max > 0) { printf("%s", longest); printf("len = %d\n", max); } return 0; }
//重新实现getline,使得getline的容错性更强。接收后的getline一定以‘\n‘结束。
int getline(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; } else if(c == EOF && i > 0) { /* gotta do something about no newline preceding EOF */ s[i] = \n; ++i; } s[i] = \0; return i; } void copy(char to[], char from[]) { int i; i = 0; while((to[i] = from[i]) != \0) ++i; }
bubuko.com,布布扣

 

c程序设计语言_习题1-16_自己编写getline()函数,接收整行字符串,并完整输出,布布扣,bubuko.com

c程序设计语言_习题1-16_自己编写getline()函数,接收整行字符串,并完整输出

原文:http://www.cnblogs.com/haore147/p/3647948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!