一个非常经典精巧的字符处理程序

最近随便翻了翻《C程序设计语言》这本书,也有了不少收获,所谓温故而知新。

看到一个练习题,很有意思,是第一章的练习1-9,题目如下:

编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。

乍看感觉不难,输入复制到输出很简单,

int c;

while((c=getchar()!=EOF)) 
    putcher(c);

 

后一步用一个空格代替多个空格就很有意思。

我一开始思路走了死角,在想着要怎么检测出多个空格,最后也只想到了个笨方法:

就是把输入的字符先存到一个数组,然后再遍历,遇到字符就输出,遇到空格就只输出一个空格,然后后面接着的空格直接跳过,遇到字符再继续输出。

但是这样无疑效率太低,于是网上google了下看有没更好的方法。

结果果然找了一个更精简的程序,不敢私藏,发在这里跟大家一起分享。

/*
* =====================================================================================
*
* Filename: 1.9.c
*
* Description: using one sapce to replace multi-space
*
* Version: 1.0
* Created: 10/20/2012 07:53:34 PM
* Revision: none
* Compiler: gcc
*
* Author: Citizen Paathurnax citizen2047@gmail.com
* Company: GDUPT
*
* =====================================================================================
*/

#include <stdio.h>


int main(){
    int c,var=0;

    for(;(c=getchar())!=EOF;){

        if(c!=' '){

            putchar(c);

        }else if(var!=' '){

            putchar(c);

        }

        var=c;

    }
    return 0;
}                

如果遇到第一个空格,则执行else if 里的putchar(c),因为c为空格而var不为空格,然后把空格的值赋给var。

接下来有两个情况,要不继续出现空格,要不是出现其他字符。

要是出现空格,此时var的值已经是空格了,则不执行putchar(),继续把空格的值赋给var,后面如果继续出现空格也是一样的处理。

要是出现字符,则执行第一个putchar(),然后把字符赋给var。

这样就满足了题目的要求了!

这样跟我一开始的思路比较,真是简单明了了好多!

posted on 2012-10-21 23:44  曼查狂人  阅读(475)  评论(2)    收藏  举报