用C编程计算文本文件中给定单词的频率
Program in C to count the frequency of a given word in a text file
用 C 编写的程序计算文本文件中给定单词的频率
我制作这个程序的目的是计算文本文件中给定单词的频率,但计算字符数。
需要帮助来修复它。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fptr;
char ch, * word, * a;
int i=0, p=0;
word =(char *) malloc(25 * sizeof(char));
fptr = fopen("text.txt", "r");
if (!fptr)
{
printf("File not found. \n");
}
else
{
printf("Word: ");
scanf("%s", word);
while(word[p]!='[=10=]')
{
p++;
}
a=(char *) malloc(p * sizeof(char));
while (*(ch+a) != EOF)
{
*(ch+a) = getc(fptr);
if (*(ch+a) == * word)
{
i++;
}
}
}
if (i==0)
printf("Word not found.\n");
else
{
printf("Word found %d times.\n",i);
}
fclose(fptr);
return 0;
}
您的代码中的错误是 getc()
只将一个字符存入内存。所以你不能做这个 *(ch+a) == * word
因为 ch
的值不是 地址 。
let ch='x'
和 let a=10
so *(ch+a)==*('x'+10)
这将取消对您未分配的地址的引用。
This 网站实现了 countOccurancees
函数,它接受一个指向 const char
的指针和一个文件指针以及 return 单词出现的次数。
strstr()
通过 return 指向所定位子字符串开头的指针来帮助找到单词的第一次出现。
#define BUFFER_SIZE 100
int countOccurrences(FILE *fptr, const char *word)
{
char str[BUFFER_SIZE];
char *pos;
int index, count;
count = 0;
// Read line from file till end of file.
while ((fgets(str, BUFFER_SIZE, fptr)) != NULL)
{
index = 0;
// Find next occurrence of word in str
while ((pos = strstr(str + index, word)) != NULL)
{
// Index of word in str is
// Memory address of pos - memory
// address of str.
index = (pos - str) + 1;
count++;
}
}
return count;
}
所以在 main
函数中只需要 i=countOccurrences(fptr, word);
main
应该看起来像
int main()
{
FILE * fptr;
char * word;
int i=0;
word = malloc(25 * sizeof(char));//Do NOT cast
fptr = fopen("text.txt", "r");
if (!fptr)
printf("File not found. \n");
else
{
printf("Word: ");
scanf("%s", word);
i=countOccurrences(fptr, word);
}
if (i==0)
printf("Word not found.\n");
else
printf("Word found %d times.\n",i);
fclose(fptr);
return 0;
}
用 C 编写的程序计算文本文件中给定单词的频率
我制作这个程序的目的是计算文本文件中给定单词的频率,但计算字符数。
需要帮助来修复它。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fptr;
char ch, * word, * a;
int i=0, p=0;
word =(char *) malloc(25 * sizeof(char));
fptr = fopen("text.txt", "r");
if (!fptr)
{
printf("File not found. \n");
}
else
{
printf("Word: ");
scanf("%s", word);
while(word[p]!='[=10=]')
{
p++;
}
a=(char *) malloc(p * sizeof(char));
while (*(ch+a) != EOF)
{
*(ch+a) = getc(fptr);
if (*(ch+a) == * word)
{
i++;
}
}
}
if (i==0)
printf("Word not found.\n");
else
{
printf("Word found %d times.\n",i);
}
fclose(fptr);
return 0;
}
您的代码中的错误是 getc()
只将一个字符存入内存。所以你不能做这个 *(ch+a) == * word
因为 ch
的值不是 地址 。
let ch='x'
和 let a=10
so *(ch+a)==*('x'+10)
这将取消对您未分配的地址的引用。
This 网站实现了 countOccurancees
函数,它接受一个指向 const char
的指针和一个文件指针以及 return 单词出现的次数。
strstr()
通过 return 指向所定位子字符串开头的指针来帮助找到单词的第一次出现。
#define BUFFER_SIZE 100
int countOccurrences(FILE *fptr, const char *word)
{
char str[BUFFER_SIZE];
char *pos;
int index, count;
count = 0;
// Read line from file till end of file.
while ((fgets(str, BUFFER_SIZE, fptr)) != NULL)
{
index = 0;
// Find next occurrence of word in str
while ((pos = strstr(str + index, word)) != NULL)
{
// Index of word in str is
// Memory address of pos - memory
// address of str.
index = (pos - str) + 1;
count++;
}
}
return count;
}
所以在 main
函数中只需要 i=countOccurrences(fptr, word);
main
应该看起来像
int main()
{
FILE * fptr;
char * word;
int i=0;
word = malloc(25 * sizeof(char));//Do NOT cast
fptr = fopen("text.txt", "r");
if (!fptr)
printf("File not found. \n");
else
{
printf("Word: ");
scanf("%s", word);
i=countOccurrences(fptr, word);
}
if (i==0)
printf("Word not found.\n");
else
printf("Word found %d times.\n",i);
fclose(fptr);
return 0;
}