C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序
2019獨角獸企業重金招聘Python工程師標準>>>
首先,這個程序應該逐個讀取字符,并且應該有些方法判斷何時停止;第二,它應該能夠識別并統計下列單位:字符、行和單詞。下面是偽代碼描述:
read a character while there is more inputincrement character count if a line has been read ,increment line countif a word has been read ,increment word countread next character前面已經有輸入循環的模型了:
while ((ch=getchar())!=STOP) {.... }這里的STOP代表通知輸入結束的ch取值。現在我們暫且選擇一個在文本中不常見的字符(|)。
現在來考慮一下循環體。因為程序使用getchar()來輸入字符,所以可以在每個循環周期通過遞增一個計數器的值來統計字符 。為了統計行數,程序可以檢查換行符。如果字符 是換行符,程序就遞增行數計數器的值。有個問題是如果STOP字符出現在一行的中間該 怎么辦?行數計數應不應該增加呢?一種做法是將它作為一個不完整的行統計,也就是說,該行有字符 而沒有換行符。可以通過追蹤前一個字符來識別這種情況 。如果STOP之前所讀入的最后一個字符不是換行符,就計數一個不完整行。
最棘手的部分是識別單詞,首先,必須明確定義一個單詞意味著什么。讓我們以一個相對簡單的方法將一個單詞定義為不包含空白字符的一系列字符。一個單詞以程序首次遇到非空白字符開始,在下一個空白字符出現時結束。使用ctype.h中的isspace( )函數會更簡單。如果C是空白字符,isspace(c)為真,如果c不是空白字符!isspace(c)為真。
為了知道一個字符是不是在某單詞里,可以在讀入一個單詞的首字符時把一個標志(命名為inword)設置為1。也可以在此處遞增單詞的計數。
然后,只要inword保持為1,后續的非空白字符就不標記為一個單詞的開始。到出現下一個空白字符時,必須將此標志重置為0,并且程序準備搜索下一個單詞。
if c is not whitespace and inword is falseset inword to true and count the word if c is whitespace and inword is trueset inword to false這種方法在每個單詞開始時將inword設置為1,而在每個單詞結束時將其設置為0.僅在該標志從0變為1時對單詞計數。
//word.c --統計字符、單詞和行 #include <stdio.h> #include <ctype.h> #include <stdbool.h> #define STOP '|' int main(void) {char c ; //讀入字符char prev; //前一個字符long n_chars=0L; //字符數int n_lines=0; //行數int n_words=0; //單詞數int p_lines=0; //不完整的行數bool inword=false; //如果c在一個單詞中,則inword等于trueprintf("Enter text to be analyzed(| to terminate): \n");prev='\n'; //用于識別完整的行while((c=getchar())!=STOP){n_chars++; //統計字符if(c=='\n')n_lines++; //統計行數if(!isspace(c)&&!inword){inword=true; //開始一個新單詞n_words++; //統計單詞}if(isspace(c)&&inword)inword=false; //到達單詞尾部prev=c; //保存字字符值}if(prev!='\n')p_lines=1;printf("characters=%ld,words=%d,lines=%d,",n_chars,n_words,n_lines);printf("partial lines = %d\n",p_lines);return 0; }?
轉載于:https://my.oschina.net/idreamo/blog/693719
總結
以上是生活随笔為你收集整理的C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python parser count_
- 下一篇: linux 安装python_Linux