C圣经---删除输入行末尾的空格以及制表符,并删除完全是空格的行

源自<The C language programming>

编写一个程序,删除每个输入行末尾的空格以及制表符,并删除完全是空格的行

 

getline函数,能够在读入文本行时返回该行的长度,而在遇到文件结束符时返回0

由于0不是有效的行长度,因此可以作为标志文件结束的标志.

每一行,至少包括一个字符,只包含换行符的行,其长度为1

 

 1.下面的代码只是并未真正删除空格以及制表符,只是让其不再显示

#include<stdio.h>
//#include<stdlib.h>
#define MAXLINE 1000
int getline(char s[], int lim);
int main(){
    int len,i;
    char line[MAXLINE];
    while( (len = getline(line,MAXLINE))> 0){     //如果还有未处理的输入行 ,len为输入行的长度  
        //printf("%s",line);
       for(i = 0; i < len; i++)  //打印输入行 
         printf("%c",line[i]);
       //printf("\n");
    }   
    //system("pause");
   return 0;    
}
int getline(char s[], int lim){
    int i,j,len;
    char c;
    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';
    
    len = i;//len表示字符串的长度 
    //从字符串的末尾开始处理,输入行末尾是空格及制表符,并且输入行完全是空格的情况 
    for(j = i - 1; j >= 0;j--){
        if(s[j] != ' ' && s[j] != '\t') //如果从字符串末尾开始,遇到不是' '且不是'\t' 
           break;                       //则跳出循环,处理结束 
        if(s[j] == ' ' || s[j] == '\t') //如果遇到' '或者'\t',则将字符串的长度-- 
           len--; 
    }
    return len;
}


2.书上的答案

#include<stdio.h>
#include<stdlib.h>
#define MAXLINE 1000
/*编写一个程序,删除每个输入行末尾的空格及制表符,
        并删除完全是空格的行
*/ 
int getline(char s[],int lim);
int remove(char s[]);
int main(){
    char line[MAXLINE];
    
    while( getline(line,MAXLINE) > 0){ //如果存在未处理的输入行 
            if(remove(line) > 0)
               printf("%s",line);
  
   }
   system("pause");
  return 0;
} 
int getline(char s[], int lim){
    int i;
    char c;
    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;
}
int remove(char s[]){
    int i = 0;
    while(s[i] != '\n') //每个输入行末两位是'\n','\0' 
       i++;
       
    i--;  //back off from '\n'
    
    //如果当前的字符为' ' 或者为'\t',则i继续向前进行判断 
    while( i >=0 && (s[i] == ' ' || s[i] == '\t' )){
       i--;
    }  
    //is it a noblank line?
    if(i >= 0){  //如果i>=0,则表明输入行不是空行,至少有一个字符 
       i++;      
       s[i] = '\n'; //put newline character back
       i++;
       s[i] = '\0'; //terminate the string
    }
    
    return i;//返回newline的长度 
    
}


 

 

 

remove函数负责删除掉字符line末尾的空格和制表符并返回他的新长度

如果这个长度 > 0 ,则说明line中有不是空格和制表符的其他字符,程序就会把这以后打印出来

,否则就说明这一行完全是由空格和制表符构成的,程序就将忽略掉这一行

 

remove函数首先找到'\n'

然后倒退一个位置,随后这个函数从后向前检查空格或制表符,直到他找到一个不是空格或者制表符的字符,或者没有字符可让它继续倒退(i < 0)

如果i >= 0,则表明至少有一个字符,此后,函数remove将换行符和字符串结束符写回输入行,再返回变量i

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“设计模式:可重用的面向对象软件的基本元素(Design Patterns: Elements of Reusable Object-Oriented Software)”是一本由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人所著的经典书籍。该书于1994年首次出版,被誉为“软件设计模式圣经”。 该书讲述了一些经典的设计模式,包括面向对象编程中涉及到的对象、类、接口和继承等基本概念,并详细介绍了在实际应用中如何使用这些模式来解决常见的设计问题。 该书的主要内容包括:介绍了23种设计模式,其中分为创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和为型模式(Behavioral Patterns)三种类型;每个设计模式包括模式的定义、优点、结构以及应用场景等方面,以及一些常见的解决方案;此外,该书还特别强调了设计模式的重要性,并简要介绍了如何利用设计模式提高代码的可维护性和可重用性等方面。 该书的读者主要包括软件开发人员、软件架构师、系统设计师等技术人员,也适合经验较浅的Java、C++和C#等编程语言的初学者,读过该书后可以深刻理解并熟练运用设计模式来提高软件开发的效率和质量。 在CSDN(中文技术社区)上,设计模式是一门热门的技术,有很多人通过阅读“设计模式:可重用的面向对象软件的基本元素”这本书籍,来掌握设计模式的基础知识,并学习如何在实际项目中应用这些模式。该书也经常被提及在CSDN社区中的技术讨论中,并被认为是学习设计模式最权威的教材之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值