在c中遇到断言问题

时间:2014-09-09 05:28:36

标签: c assert

我的目标是比较散列策略,我正在编写一个编程任务。对于程序的主要部分,允许用户使用选项(使用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)

我真的不太清楚为什么会这样。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您在while循环中使用fopen

while (getword(word, sizeof word, fopen(filename, "r")) != EOF) {

getword关闭FILE*吗?如果没有,你有很多打开的文件句柄。

您可能需要的是:

  1. while循环开始之前打开文件。
  2. 在循环中使用FILE*
  3. 离开while循环后关闭文件。
  4. 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);