C圣经--打印最长文本行

源自<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函数进行判定是否还有未处理的文本行


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值