状态机的使用
关于状态机的文章请自行百度,这里主要是在统计时用到了2个状态,IN是代表字符是属于word内,OUT代表当前字符不属于word内,那么什么时候word的个数需要增加1呢,即是status从OUT到IN时(说明当前指针马上就要走到word里了)
源码
#include <stdio.h> #define IN 1 #define OUT 0 #define INIT OUT int is_spliter(const char c) { if ((' ' == c) || ('\n' == c) || ('\t' == c) || ('\"' == c) || ('\'' == c) || ('+' == c) || (',' == c) || ';' == c || '.' == c) { return 1; } return 0; } int count_word(const char *filename) { int status = INIT;//默认状态 int word = 0; FILE *file = fopen(filename, "r"); if (!file) return -1; char c; while ((c = fgetc(file)) != EOF) { //当然,如果要做的好一点,肯定需要 //正则表达式来判断一个字符是否是分隔符,这里就列出一些常见情况 if (is_spliter(c)) { status = OUT; } else if (status == OUT)//从分隔符进入到word的开始 { status = IN;//在word内的状态 ++word; } } return word; } int main(int argc, char *argv[]) { if (argc < 2) return -1; printf("count:%d\n", count_word(argv[1])); return 0; }
说明
源码出自-腾讯课堂-king老师-linux基础课程
思考:如果一个word最后带-并且换行的情况