状态机实现单词统计
如何编写一个程序来统计文本中有多少单词。
我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如电灯的状态就是两个亮 和灭 。 状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。
当我们在统计单词的时候,由两部分组成。 一部分为OUT
(表示不属于单词的范畴),另一部分为IN
(表示属于单词的范畴)。
- 我们可以定义一个枚举类型来表示状态机的状态,如:
#define OUT 0
#define IN 1
#define INIT OUT
- 然后,定义一个函数来处理状态转移:
int splite(char c){
if((' '==c)||('\n'==c)||('\t'==c)||(','==c)||('.'==c)||('!'==c)||('+'==c)||('-'==c)||('?'==c)||(';'==c))
return 1;
else
return 0;
}
- 在主函数中,我们读取文件中的字符,并根据状态转移函数进行处理。当状态机从单词状态转移到非单词状态时,我们判断是否统计到了目标单词,并更新计数器。最后,输出统计结果。
int count_word(char *filename){
int status = INIT;
int word = 0;
FILE *fp = fopen(filename, "r");
if(fp == NULL) return -1;
char c;
while((c = fgetc(fp)) != EOF){
if(splite(c)){
status = OUT;
} else if(OUT == status){
status = IN;
word++;
}
}
return word;
}
int main(int argc, char *argv[]){
if (argc < 2) return -1;
printf("word:%d\n", count_word(argv[1]));
}
2.使用C语言实现单词统计器
若需要统计文本内某单词有多少个
- 代码如下:
#include<stdio.h>
#include<string.h>
#define OUT 0
#define IN 1
int count_word(const char *filename, const char *word) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) return -1;
int count = 0;
char buffer[256]; // 假设单词的最大长度为255字符
char c;
int word_index = 0;
while ((c = fgetc(fp)) != EOF) {
// 如果字符是分隔符,检查是否找到了单词
if (c == ' ' || c == '\n' || c == '\t' || c == ',' || c == '.' || c == '!' || c == '+' ||
c == '-' || c == '?' || c == ';' || c == EOF) {
buffer[word_index] = '\0'; // null-terminate the word
if (strcmp(buffer, word) == 0) {
count++;
}
word_index = 0; // 重置单词索引
} else {
buffer[word_index++] = c; // 添加字符到单词缓冲区
if (word_index >= 255) {
word_index = 0; // 防止缓冲区溢出
}
}
}
fclose(fp);
return count;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
const char *filename = argv[1];
const char *word = "my"; // 要统计的单词例如单词"my"
int count = count_word(filename, word);
printf("The word '%s' appears %d times in the file '%s'.\n", word, count, filename);
return 0;
}