源自<The C language programming >
程序读入一组文本行,并把最长的文本行打印出来
</pre><pre name="code" class="plain">#include<stdio.h>
#define MAXLINE 1000 //允许的输入行的最大长度
int getline(char line[], int maxline);
void copy(char to[], char form[]);
//打印最长的输入行
int main(){
int len; //当前长度
int max; //目前为止发现的最长行的长度
char line[MAXLINE]; //当前的输入行
char longest[MAXLINE]; //用于保存最长的行
max = 0;
while( (len = getline(line,MAXLINE)) > 0){
if(len > max){
max = len;
copy(longest,line);
}
}
if(max > 0)
printf("%s", longest);
return 0;
}
//getline函数:将一行读入到s中,并返回其长度
int getline(char s[], 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;
}
//copy函数:将from复制到to;这里假设to足够大
void copy(char to[],char from[]){
int i = 0;
while((to[i] = from[i])!= '\0'){
i++;
}
}
1.getLine函数中
for(i = 0; i < lim - 1; i++)
i < lim -1而不是 i<= lim - 1,是因为getline函数把字符'\0'插入到它创建的数组的末尾,以标记字符串的结束
所以需要空出一个s[lim-1]来存放'\0'以表示读取到的一行文本字符串的结束,
只有这样,copy函数的实现正是依赖于输入参数由'\0'结束这一事实,它将'\0'拷贝到输出参数中
并且限定i < lim - 1 也是检查是否输入的文本行长度是否超出,如果超出,getlin函数执行也是安全的,无论是否达到换行符,当数组满时它将停止读字符
2.
prinf函数中的 格式规范%s规定,对应的参数必须是以'\0'为结束符的字符串
3.
while((to[i] = from[i])!= '\0'){
i++;
}
此处写法相当精简
疑惑>>>>>
4.对于EOF还有一些不太理解
比如 输入 abcd\n
abcdEOF
此时getchar函数怎么处理?
假如EOF文件结束符是紧跟在输入文本行之后的,此时传入main函数的i值为abcd的长度
下一次还需要进入getline函数进行判定是否还有未处理的文本行