一个非常经典精巧的字符处理程序
最近随便翻了翻《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。
这样就满足了题目的要求了!
这样跟我一开始的思路比较,真是简单明了了好多!
浙公网安备 33010602011771号