问题:编写程序用于统计行数字符数与单词数。(这里的单词是其中不包含空格、制表符、或换行符的字符序列)
代码:
1 #include<stdio.h> 2 #define OUT 0 3 #define IN 1 4 5 int main() 6 { 7 int n1,nw,nc; 8 char c; 9 int state = OUT; 10 while((c=getchar())!=EOF) 11 { 12 nc++;//字符数 13 if(c==' ') 14 { 15 n1++;//行数 16 } 17 else if(c==' '||c==' '||c==' ') 18 { 19 state=OUT; 20 } 21 else if(state==OUT) 22 { 23 state=IN; 24 nw++;//单词数 25 } 26 return 0; 27 }
分析:程序执行时,每当遇到单词的第一个字符,它就作为一个新单词加以统计。state变量记录程序当前是否正在位于一个单词中,它的初值是不在单词中,即初值被赋值为OUT。我们在这里使用了符号常量IN与OUT,而没有使用其对应的数值0、1,这样程序更易读。在较小的程序中,这种做法看不出有什么优势,但在较大的程序中,如果从一开始就这样做,因此增加的一点工作量与提高程序的可读性带来的好处相比是值得的。读者也会发现,如果程序中的幻术都以符号常量的形式出现,对程序今次进行大量修改就会相对容易很多。程序中的if语句中的判断条件是:如果c是空格,或c是换行符,或c是制表符,则执行下面的语句,这一条表达式由左向右求值,如果一个为真,再不往后判断,整个判断条件即为真。