我是C和指针的新手,所以它仍然令人困惑!下面是一个函数的代码,主要目的是查找单词出现在文本文件中的次数。任何帮助将不胜感激!
void count_occurrences (int n, FILE *file, Entry *entries) {
file = fopen("test/flicka.txt", "r");
if (file != NULL) {
char buff[LINE_MAX_CHARS];
int i = 0;
char * haystack = fgets(buff, 1000, file);
char * needle = NULL;
char * p = NULL;
while (haystack != NULL) {
for (i; i < n; i++) {
needle = entries[i].string;
while ( (p = strstr(haystack, needle)) != NULL) {
entries[i].count++;
p++;
}
}
haystack = fgets(buff, 1000, file);
i = 0;
}
fclose(file);
}
else {
printf("File not found!\n");
}
}
答案 0 :(得分:0)
这样的练习的问题在于解决特定问题的最佳方法 - 连接到流的基于字符的状态机 - 不会扩展到更大的问题。
首先,你保持一个“解析位置”,最初为零。然后在循环中调用fgetc(),直到数据用完并获得EOF。如果字符与解析位置处的字符匹配,则递增解析位置,如果解析位置到达字符串的末尾,则表示匹配,因此递增计数。如果没有,请将解析位置重置为零或一,具体取决于第一个字符是否匹配。
第一种方法快速而简单,但不灵活。
更可扩展的方式是基于行的输入。如果您知道行必须很短,请使用大缓冲区调用fgets,或者如果行无界限则构建“getline”。然后在该行上调用strstr以查看您是否匹配。如果匹配,则需要递增指针并检查另一个指针。
可扩展的方式将解析与IO分开,并允许您搜索多个模式。伪代码
while(line = getline() )
{
N += countwords(line, "myword");
}
int countwords(line, word)
{
ptr = line;
while(strstr(ptr, word))
{
ptr = strstr(ptr, word) + strlen(word); // replace strlen with 1 to allow overlaps
answer++;
}
}
显然你现在需要修改主循环来搜索几个单词,保留一个Ns数组并用每个单词重复调用。但它可以扩展到任何类型的模式匹配。