我是C新手并编写了一个小程序,它从文件中读取大量推文,将主题标签存储在哈希表中,然后打印最常出现的10个主题标签。
该程序现已正常运行,但我收到了一条我不理解的错误,Abort trap:6。
通过调试我已确定它出现在该行上:
if (fscanf(src_file, "%s", current_word) == EOF){
在最后一次迭代。使用打印,我已经看到文件的其余部分被正确处理,并且当上述行到达EOF时总是会发生这种情况。
修正错误的原因是将char current_word []变量的初始容量从257增加到1000.但是,这远远大于我处理的几乎所有单词所需的容量。任何人都可以让我更深入地了解fscanf()到达文件末尾时的情况以及为什么我显然需要为它分配更多空间?
快速注意:代码段会调用此处未列出的功能,但会在追踪错误时将其删除,并且不会影响错误的行为。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "hashtable.h"
#include <ctype.h>
//NOTE: using 0 for all failiures and 1 for all success
int main(int argc, char **argv){
//opens file via command line argument
FILE *src_file = fopen(argv[1], "r");;
if (src_file == NULL){
fprintf(stderr, "There was an error opening the file.") ;
return 0;
}
//define hashtable and malloc space
hashtable* tweet_table = malloc(sizeof(hashtable));
//read word by word and put any hashtags in hashtable
char current_word[257];
int looper = 1;
while (looper == 1){
if (fscanf(src_file, "%s", current_word) == EOF){
looper = 0;
}
else if (current_word[0] == '#'){
int i;
for (i = 1; i < strlen(current_word); i+=1){
current_word[i] = tolower(current_word[i]);
}
assert (put(current_word, tweet_table) == 1);
}
}
//sorts and prints 10 most common tweets
find_frequent(tweet_table);
//close file when finished with operations
fclose(src_file);
printf("all good");
return 1;
}
答案 0 :(得分:1)
修改代码以防止阅读current_word
@Jonathan Leffler
代码可能仍需要使用大于257的值。
char current_word[257];
...
// if (fscanf(src_file, "%s", current_word) == EOF){
// 256 is the max input string length, 1 less that array size
if (fscanf(src_file, "%256s", current_word) == EOF) {
以下是其他建议的更改:
// Only one ; needed
// FILE *src_file = fopen(argv[1], "r");;
FILE *src_file = fopen(argv[1], "r");
// Consider this style: IMO less error prone and easier to maintain
// hashtable* tweet_table = malloc(sizeof(hashtable));
hashtable* tweet_table = malloc(sizeof *tweet_table);
// Simplify
//int looper = 1;
//while (looper == 1){
// if (fscanf(src_file, "%s", current_word) == EOF){
// looper = 0;
while (fscanf(src_file, "%256s", current_word) == 1) {
// calculate length once, use size_t (although with limits like 257, int will do)
// int i;
// for (i = 1; i < strlen(current_word); i+=1){
size_t len = strlen(current_word);
size_t i;
for (i = 1; i < len; i+=1) {
可以添加测试if (len == 256)
,那么您的缓冲区大小可能太小了。如果要编写具有动态缓冲区大小的代码,还需要做更多的工作。检查您的系统是否有getline()
。