C說話編程中統計輸出的行數和單詞個數的辦法。本站提示廣大學習愛好者:(C說話編程中統計輸出的行數和單詞個數的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話編程中統計輸出的行數和單詞個數的辦法正文
統計輸出的行數
尺度庫包管輸出文本流以行序列的情勢湧現,每行均以換行符停止。是以,統計行數等價於統計換行符的個數。
#include <stdio.h> /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); }
在該法式中,while 輪回語句的輪回體是一個 if 語句,它掌握自增語句++nl。if 語句先測試圓括號中的前提,假如該前提為真,則履行厥後的語句(或括在花括號中的一組語句)。這裡再次用縮進方法注解語句之間的掌握關系。
雙等於號==是 C 說話中表現“等於”關系的運算符(相似於 Pascal 中的單等於號=及 Fortran 中的.EQ.)。因為 C 說話將單等於號=作為賦值運算符,是以應用雙等於號==表現相等的邏輯關系,以示辨別。這裡提示留意,在表現“等於”邏輯關系的時刻(應當用==),C 說話初學者有時會毛病地寫成單等於號=。在前面我們將看到,即便如許誤用了,其成果平日依然是正當的表達式,是以體系不會給出正告信息。
單引號中的字符表現一個整型值,該值等於此字符在機械字符集中對應的數值,我們稱之為字符常量。然則,它只不外是小的整型數的另外一種寫法罷了。例如,'A'是一個字符常量;在 ASCII 字符集中其值為 65(即字符 A 的外部表現值為 65)。固然,用'A'要比用 65 好,由於。'A'的意義更清晰,且與特定的字符集有關。
字符串常量中應用的本義字符序列也是正當的字符常量,好比,'\n'代表換行符的值,在 ASCII 字符集中其值為 10。我們應該留意到,'\n'是單個字符,在表達式中它不外是一個整型數罷了;而"\n"是一個僅包括一個字符的字符串常量。
上面編寫一個統計空格、制表符與換行符個數的法式。
#include <stdio.h> main() { /* blanks, tabs, and newlines */ int c, nb, nt, nl; nb = 0; nt = 0; nl = 0; while( (c = getchar()) != EOF) { if(c == ' ') ++nb; if(c == '\t') ++nt; if(c == '\n') ++nl; } printf("%d %d %d \n", nb, nt, nl); }
統計輸出的單詞個數
這裡對單詞的界說比擬寬松,它是任何個中不包括空格、制表符或換行符的字符序列。上面這段法式是 UNIX 體系中 wc 法式的主干部門:
#include <stdio.h> #define IN 1 /* inside a word */ #define OUT 0 /* outside a word */ /* count lines, words, and characters in input */ main() { int c, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; while ((c = getchar()) != EOF) { ++nc; if (c == '\n') ++nl; if (c == ' ' || c == '\n' || c == '\t') state = OUT; else if (state == OUT) { state = IN; ++nw; } } printf("%d %d %d\n", nl, nw, nc); }
法式履行時,每當碰到單詞的第一個字符,它就作為一個新單詞加以統計。state 變量記載法式以後能否正位於一個單詞當中,它的初值是“不在單詞中”,即初值被賦為 OUT。我們在這裡應用了符號常量 IN 與 OUT,而沒有應用其對應的數值 1 與 0,如許法式更容易讀。在較小的法式中,這類做法或許看不出有甚麼優勢,但在較年夜的法式中,假如從一開端就如許做,是以而增長的一點任務量與進步法式可讀性帶來的利益比擬是值得的。讀者也會發明,假如法式中的幻數都以符號常量的情勢湧現,對法式停止年夜量修正就會絕對輕易很多。
以下語句 nl = nw = nc = 0; 將把個中的 3 個變量 nl、nw 與 nc 都設置為 0。這類用法很罕見,但要留意如許一個現實:在兼有值與賦值兩種功效的表達式中,賦值聯合順序是由右至左。所以下面這條語句同等於 n1 = (nw = (nc = 0));
運算符||代表 OR(邏輯或),所以以下語句 if (c == ' ' || c== '\n' || c == '\t') 的意義是“假如 c 是空格,或 c 是換行符,或 c 是制表符”(後面講過,本義字符序列\t 是制表符的可見表現情勢)。響應地,運算符&&代表 AND(邏輯與),它僅比||高一個優先級。由&&或||銜接的表達式由左至右求值,並包管在求值進程中只需可以或許斷定終究的成果為真或假,求值就立刻終止。假如 c 是空格,則沒有需要再測試它能否為換行符或制表符,如許就不用履行前面兩個測試。在這裡,這一點其實不特殊主要,但在某些更龐雜的情形下如許做就有需要了,不久我們將會看到這類例子。
這段法式中還包含一個 else 部門,它指定當 if 語句中的前提部門為假時所要履行的舉措。其普通情勢為:
if (表述式) 語句 1 else 語句 2
個中,if-else 中的兩條語句有且唯一一條語句被履行。假如表達式的值為真,則履行語句 1,不然履行語句 2。這兩條語句都既可所以單條語句,也能夠是括在花括號內的語句序列。在單詞計數法式中,else 以後的語句還是一個 if 語句,該 if 語句掌握了包括在花括號內的兩條語句。