打算这段时间重新拜读TCPL这本经典著作,并把后面的习题都做一遍。结果,发现我的决定是多么的正确,多么有必要。
原因在于下午一道练习题,很简单:编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格来表示。
很简单,本来前几章的练习都不打算写,因为之前国庆回家正好带回了一本《The C Answer Book》,就打算写写然后看看答案。不假思索我就写了一个程序:
代码
#include
<
stdio.h
>
#define FALSE 0
#define TRUE 1
int main( void )
{
int c;
int flag = FALSE;
while ((c = getchar()) != EOF)
{
if (flag == FALSE)
{
putchar(c);
if (c == ' ' )
flag = TRUE;
}
else
{
if (c != ' ' )
{
flag = FALSE;
putchar(c);
}
}
}
return 0 ;
}
#define FALSE 0
#define TRUE 1
int main( void )
{
int c;
int flag = FALSE;
while ((c = getchar()) != EOF)
{
if (flag == FALSE)
{
putchar(c);
if (c == ' ' )
flag = TRUE;
}
else
{
if (c != ' ' )
{
flag = FALSE;
putchar(c);
}
}
}
return 0 ;
}
这当然能正确运行。但是,我看TCAB,里面有3种简单的解法。地一种和我差不多,可是第三种明显简洁很多,真是相形见绌了。下面就是第三种方法:
代码
#include
<
stdio.h
>
#define NONBLANK 'a'
int main( void )
{
int c, lastc;
lastc = NONBLANK;
while ((c = getchar()) != EOF)
{
if (c != ' ' || lastc != ' ' )
putchar(c);
lastc = c;
}
return 0 ;
}
#define NONBLANK 'a'
int main( void )
{
int c, lastc;
lastc = NONBLANK;
while ((c = getchar()) != EOF)
{
if (c != ' ' || lastc != ' ' )
putchar(c);
lastc = c;
}
return 0 ;
}
这个例子告诉再一次提醒我:永远不要小看一个简单的程序,里面蕴含的道理很有可能能影响到你以后的水平。程序就是要尽量简洁,虽然我们大家都明白这个道理,但是到了实际工作,你能保证你的程序永远都是那么简洁么?