我的目标是比较散列策略,我正在编写一个编程任务。对于程序的主要部分,允许用户使用选项(使用getopt)。 我试图解决的问题是我有一个选项,告诉程序扫描字典并将stdin中给出的单词与字典中的单词进行比较,然后打印带有差异的单词(来自stdin的单词) 。这是代码部分:
if (flag_c) {
while (getword(word, sizeof word, fopen(filename, "r")) != EOF) {
start = clock();
if (htable_search(h, word) == 0) {
fprintf(stderr, "%s\n", word);
unknown_word_count++;
}
search_time += (clock() - start) / (double) CLOCKS_PER_SEC;
}
printf("Fill time : %f\n", fill_time);
printf("Search time : %f\n", search_time);
printf("Unknown words = %d\n", unknown_word_count);
}
现在我认为问题在于while循环条件。 getword函数定义如下:
int getword(char *s, int limit, FILE *stream) {
int c;
char *w = s;
assert(limit > 0 && s != NULL && stream != NULL);
/* skip to the start of the word */
while (!isalnum(c = getc(stream)) && EOF != c)
;
if (EOF == c) {
return EOF;
} else if (--limit > 0) { /* reduce limit by 1 to allow for the \0 */
*w++ = tolower(c);
}
while (--limit > 0) {
if (isalnum(c = getc(stream))) {
*w++ = tolower(c);
} else if ('\'' == c) {
limit++;
} else {
break;
}
}
*w = '\0';
return w - s;
}
当我运行程序时,我收到错误:
Test: mylib.c:10: getword: Assertion `limit > 0 && s != ((void *)0) && stream != ((void *)0)' failed.
Aborted (core dumped)
我真的不太清楚为什么会这样。有什么想法吗?
答案 0 :(得分:1)
您在while循环中使用fopen
:
while (getword(word, sizeof word, fopen(filename, "r")) != EOF) {
getword
关闭FILE*
吗?如果没有,你有很多打开的文件句柄。
您可能需要的是:
while
循环开始之前打开文件。FILE*
。while
循环后关闭文件。FILE* fp = fopen(filename, "r");
if ( fp == NULL )
{
// Deal with error condition.
}
while (getword(word, sizeof word, fp) != EOF) {
start = clock();
if (htable_search(h, word) == 0) {
fprintf(stderr, "%s\n", word);
unknown_word_count++;
}
search_time += (clock() - start) / (double) CLOCKS_PER_SEC;
}
fclose(fp);