状态机的使用
关于状态机的文章请自行百度,这里主要是在统计时用到了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最后带-并且换行的情况