状态机实现单词统计

状态机实现单词统计

如何编写一个程序来统计文本中有多少单词。

我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如电灯的状态就是两个亮 和灭 。 状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型

当我们在统计单词的时候,由两部分组成。 一部分为OUT (表示不属于单词的范畴),另一部分为IN (表示属于单词的范畴)。

字母
初始化
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;
}

相关推荐

  1. 状态实现单词统计

    2024-03-26 22:54:01       17 阅读
  2. C语言实例1—统计单词个数

    2024-03-26 22:54:01       43 阅读
  3. 统计英语单词

    2024-03-26 22:54:01       32 阅读
  4. 单词统计(C语言)

    2024-03-26 22:54:01       37 阅读
  5. 统计单词

    2024-03-26 22:54:01       16 阅读
  6. pyflink统计单词

    2024-03-26 22:54:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-26 22:54:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-26 22:54:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-26 22:54:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-26 22:54:01       20 阅读

热门阅读

  1. 探索编程语言的发展历程

    2024-03-26 22:54:01       18 阅读
  2. 基于Springboot的个人博客系统的设计与实现

    2024-03-26 22:54:01       13 阅读
  3. C++ 如何去认识模板

    2024-03-26 22:54:01       17 阅读
  4. Linux 中使用ISO文件 作为yum源

    2024-03-26 22:54:01       19 阅读
  5. 洛谷 P1161 开灯 位运算

    2024-03-26 22:54:01       20 阅读
  6. OSI 模型

    2024-03-26 22:54:01       19 阅读
  7. 网络基础学习

    2024-03-26 22:54:01       18 阅读
  8. IntelliJ IDEA快捷键

    2024-03-26 22:54:01       18 阅读
  9. XML和网络编程

    2024-03-26 22:54:01       16 阅读