對從流中讀取的字元進行分類

#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,這由雙重否定 !! 完成。