C Primer Plus 第7章 C控制語句:分支和跳轉 7.4 一個統計字數的程序

首先,這個程序應該逐個讀取字符,而且應該有些方法判斷什麼時候中止;第二,它應該可以識別並統計下列單位:字符、行和單詞。下面是僞代碼描述:函數

read a character
while there is more input
    increment character count 
    if a line has been read ,increment line count
    if a word has been read ,increment word count
    read next character

前面已經有輸入循環的模型了:spa

while ((ch=getchar())!=STOP)
{
    ....
}

這裏的STOP表明通知輸入結束的ch取值。如今咱們暫且選擇一個在文本中不常見的字符(|)。code

如今來考慮一下循環體。由於程序使用getchar()來輸入字符,因此能夠在每一個循環週期經過遞增一個計數器的值來統計字符 。爲了統計行數,程序能夠檢查換行符。若是字符 是換行符,程序就遞增行數計數器的值。有個問題是若是STOP字符出如今一行的中間該 怎麼辦?行數計數應不該該增長呢?一種作法是將它做爲一個不完整的行統計,也就是說,該行有字符 而沒有換行符。能夠經過追蹤前一個字符來識別這種狀況 。若是STOP以前所讀入的最後一個字符不是換行符,就計數一個不完整行。rem

最棘手的部分是識別單詞,首先,必須明肯定義一個單詞意味着什麼。讓咱們以一個相對簡單的方法將一個單詞定義爲不包含空白字符的一系列字符。一個單詞以程序首次遇到非空白字符開始,在下一個空白字符出現時結束。使用ctype.h中的isspace( )函數會更簡單。若是C是空白字符,isspace(c)爲真,若是c不是空白字符!isspace(c)爲真。get

爲了知道一個字符是否是在某單詞裏,能夠在讀入一個單詞的首字符時把一個標誌(命名爲inword)設置爲1。也能夠在此處遞增單詞的計數。input

而後,只要inword保持爲1,後續的非空白字符就不標記爲一個單詞的開始。到出現下一個空白字符時,必須將此標誌重置爲0,而且程序準備搜索下一個單詞。it

if c is not whitespace and inword is false
    set inword to true and count the word 
if c is whitespace and inword is true
   set inword to false

這種方法在每一個單詞開始時將inword設置爲1,而在每一個單詞結束時將其設置爲0.僅在該標誌從0變爲1時對單詞計數。io

//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等於true

    printf("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;
}
相關文章
相關標籤/搜索