void CalculateWordFrequency(char* inputFile){
char* word= malloc(sizeof(char)*32);
char ch;
int count, letters=0, value;
FILE *file = fopen (inputFile, "r");
Hashtable* table = malloc(sizeof(table));
Init(table);
if ( file != NULL )
{
while((ch=getc(file))!=EOF)
{
word[0] = ch;
word++;
letters++;
if(isalpha(ch)!= 0){
word[0] = 0;
word - letters;
letters = 0;
value = HashKey(word,table);
Put(word ,value,table);
}
printf("%c", ch);
}
}else{
perror ( inputFile ); /* why didn't the file open? */
}
}
我正试图从.txt文档中获取单词并制作包含所有单词和出现次数的哈希表...
我担心的是getc()正在读取一个无效字符并给我一个分段错误。 文件中的一些文字:
哈希表 维基百科,自由的百科全书 不要与哈希列表或哈希树混淆。 哈希表 键入无序关联数组 发明于1953年 时间复杂 在大O符号 平均最坏情况 空间O(n)[1] O(n) 搜索O(1)O(n) 插入O(1)O(n) 删除O(1)O(n) 一个小电话簿作为哈希表。
和错误: 哈希表 来自维基百科,免费的百科全书
编程接收信号SIGSEGV,分段故障。 来自/lib64/libc.so.6的getc()中的0x000000321dc67f3e
答案 0 :(得分:2)
问题源于这一行:
word++;
继续递增单词指针,然后永远不会重置回缓冲区的开头。所以最终word
指向超过分配的32个字节。
我猜你打算用行重置指针:
word - letters;
但是这句话没有效果。相反,你应该使用:
word -= letters;
其他(在我看来更安全)处理此问题的方法可能是使用索引(例如word[letters]
)并保持word
不变或定期从指向开头的另一个常量指针重置指针缓冲区。