读入一组文本行,打印最长的文本行

     源自《The C Programming Language》P20 ex1.9:

     从终端读入一组文本行,并将最长的文本行打印出来

     代码:

  

main.c
1 #include <stdio.h>
2
3 #define MAXLINE 1000 //允许输入行的最大长度
4 #define LIM 8
5
6 int getline(char line[], int maxline);
7 void copy(char to[], char from[]);
8
9 int main()
10 {
11
12 int i, j;
13 int len; //当前行长度
14 int maxnum; //目前为止发现的最长行的长度
15 char line[MAXLINE]; //当前输入行
16 char longest[MAXLINE][MAXLINE]; //用于保存最长的行
17
18 i = j = 0;
19 maxnum = 0;
20 /*while((len = getline(line, MAXLINE)) > 0)
21 if(maxnum < len)
22 {
23 maxnum = len;
24 copy(longest, line);
25 }
26 if(maxnum > 0)
27 printf("%s",longest);*/
28 while((len = getline(line, MAXLINE)) > 0)
29 if(len > LIM)
30 copy(longest[i++], line);
31 --i;
32 while(j <= i)
33 printf("%s", longest[j++]);
34
35 return 0;
36 }
37
38 int getline(char s[], int lim)
39 {
40 int c, i;
41
42 for(i = 0; i<lim-1 && (c = getchar())!=EOF && c!='\n'; ++i)
43 s[i] = c;
44 if(c == '\n')
45 {
46 s[i] = c;
47 ++i;
48 }
49 s[i] = '\0';
50
51 return i;
52 }
53
54 void copy(char to[], char from[])
55 {
56 int i;
57
58 i = 0;
59 while((to[i] = from[i]) != '\0')
60 ++i;
61 }

 

     分析:

     1,  需要两个数据结构:line,longest保存当前输入行,长度最长的行,line longest均为指向大小为MAXLINE的char数组。

     2,  getline函数:将一行读入到line中,返回其长度。

          (a):for循环的判断条件,i < lim-1 && (c = getchar()) != EOF && c != '/n',当满足这些条件时,将从终端中的读入

                 字符放进s数组(即实参line数组)中。

          (b):Q:为什么不是i <= lim-1呢? A:字符串的结尾符必须是'/0',如果设置为i <= lim-1,在本例中则为i <= 999,

                  如果一个字符串刚好是1000个字符,当读入第1000个字符时,并且该字符不是'/n',也没到达文件尾,则符合for

                  循环的判断条件,执行s[i] = c;,此时字符数组s(相对应实参line)放满了,当跳出循环执行s[i] = '/0';时,因为

                  空间不够,产生了越界错误。

          (c):当读入'/n'时,意味着从输入中读入一行字符这个操作即将完成,此时需要做的就是将该'/n'和'/0'放入s[i]中。

          (d):当读入的字符为EOF,意味到达文件尾,输入中已经没有字符可供读入了,故再将/0'读入到s中,以形成一个字符串,

                 这个字符串被存储在字符数组s中。

      3,  copy函数中while判断条件:(to[i] = from[i]) != '/0' 精干简洁。

posted on 2011-04-20 05:17  将军之盾  阅读(442)  评论(0编辑  收藏  举报