使用KMP算法统计文件中特定单词出现次数和行号的C语言代码,输入要查找的单词,输出这个单词出现的次数和行号,每行代码加注释
时间: 2024-03-14 14:44:18 浏览: 153
KMP-----c语言代码实现,能够实现查找功能
下面是使用KMP算法统计文件中特定单词出现次数和行号的C语言代码,其中每行代码都有注释:
```c
#include <stdio.h>
#include <string.h>
// 计算next数组
void getNext(char *pattern, int *next) {
int n = strlen(pattern);
for (int i = 1, j = 0; i < n; i++) {
while (j > 0 && pattern[i] != pattern[j]) {
j = next[j - 1];
}
if (pattern[i] == pattern[j]) {
j++;
}
next[i] = j;
}
}
// 统计单词出现次数和行号
void countWord(char *filename, char *word) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Error: cannot open file %s\n", filename);
return;
}
char line[1024];
int lineNum = 0;
int wordCount = 0;
int n = strlen(word);
int next[n];
getNext(word, next);
while (fgets(line, sizeof(line), fp) != NULL) {
lineNum++;
char *p = line;
while ((p = strstr(p, word)) != NULL) {
int pos = p - line;
int i = pos - n;
if (i >= 0 && line[i] != ' ' && line[i] != '\t') {
// 如果单词出现在一个单词的中间,忽略
p++;
continue;
}
i = pos + strlen(word);
if (i < strlen(line) && line[i] != ' ' && line[i] != '\t' && line[i] != '\n' && line[i] != '\r') {
// 如果单词出现在一个单词的中间,忽略
p++;
continue;
}
wordCount++;
printf("Line %d: %s", lineNum, line);
p += n;
}
}
printf("Word '%s' appears %d times in file %s\n", word, wordCount, filename);
fclose(fp);
}
int main() {
char filename[256];
char word[256];
printf("Enter filename: ");
scanf("%s", filename);
printf("Enter word to search: ");
scanf("%s", word);
countWord(filename, word);
return 0;
}
```
使用方法:编译运行上述代码后,依次输入要查找的文件名和单词即可。例如,输入`test.txt`和`hello`,程序会输出该文件中单词`hello`出现的次数和行号。
阅读全文