源自《The C Programming Language》P29
从终端读入一组文本行,并将最长的文本行打印出来
代码:
#include <stdio.h> #define MAXLINE 1000 //允许输入行的最大长度 int getline(char line[], int maxline); void copy(char to[], char from[]); int main() { int len; //当前行长度 int maxnum; //目前为止发现的最长行的长度 char line[MAXLINE]; //当前输入行 char longest[MAXLINE]; //用于保存最长的行 maxnum = 0; while((len = getline(line, MAXLINE)) > 0) if(maxnum < len) { maxnum = len; copy(longest, line); } if(maxnum > 0) printf("%s",longest); return 0; } int getline(char s[], int lim) //getline:将一行读入到s中,返回其度 { 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; } void copy(char to[], char from[]) //copy:将from复制到to,假定to足够大 { int i; i = 0; while((to[i] = from[i]) != '/0') ++i;
分析:
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' 精干简洁。