對從流中讀取的字元進行分類
#include <ctype.h>
#include <stdio.h>
typedef struct {
size_t space;
size_t alnum;
size_t punct;
} chartypes;
chartypes classify(FILE *f) {
chartypes types = { 0, 0, 0 };
int ch;
while ((ch = fgetc(f)) != EOF) {
types.space += !!isspace(ch);
types.alnum += !!isalnum(ch);
types.punct += !!ispunct(ch);
}
return types;
}
classify
函式從流中讀取字元並計算空格數,字母數字和標點符號。它避免了幾個陷阱。
- 當從流中讀取字元時,結果被儲存為
int
,否則在讀取EOF
(檔案結束標記)和具有相同位模式的字元之間會存在歧義。 - 字元分類函式(例如
isspace
)期望它們的引數可以表示為unsigned char
,或者EOF
巨集的值。由於這正是fgetc
返回的內容,因此無需在此處進行轉換。 - 字元分類函式的返回值僅區分零(表示
false
)和非零(表示true
)。為計算出現次數,需要將此值轉換為 1 或 0,這由雙重否定!!
完成。