1

(C 程序)我正在尝试编译使用标头的 main.c,但出现以下错误。当我不使用标题(主文件中的所有方法)时,一切正常。

在字符串 S 中,程序查找所有出现的单词并返回出现次数最多的单词。

我正在编译使用:gcc main.c

谢谢你。

错误

In file included from main.c:9:0:
frequence.h:4:16: warning: useless storage class specifier in empty declaration [enabled by default]
main.c: In function ‘main’:
main.c:15:10: error: variable ‘word’ has initializer but incomplete type
main.c:15:10: warning: passing argument 1 of ‘show_all_words’ from incompatible pointer type [enabled by default]
frequence.h:6:17: note: expected ‘char *’ but argument is of type ‘char (*)[34]’
main.c:15:10: error: invalid use of undefined type ‘struct stat_mot’
main.c:15:19: error: storage size of ‘word’ isn’t known

主程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "frequence.h"

#define LONGUEURMAX 4

int main(char *argv[]) {
  char texte[] = ";! one two, tree foor one two !:;";
  struct stat_mot word = show_all_words(&texte);

  printf("%s : %d\n", word.word, word.frequency);

  return (EXIT_SUCCESS);
};

频率.h

#ifndef DEF_FREQUENCE
#define DEF_FREQUENCE

typedef struct stat_mot;
int count_word(char * , char * );
struct stat_mot show_all_words(char *);

#endif

频率.c

#include "frequence.h"

typedef struct stat_mot {
    char * word;
    int frequency;
} stat_mot;

int count_word(char * mot, char * text) {
  int n = 0;
  char *p;

  p = strstr(text, mot);  
  while (p != NULL) {
    n++;
    p = strstr(p + 1, mot);
  }  

  return n;
}

stat_mot show_all_words(char * text) {
    char * text_rw = strdup(text);
    char * p = strtok(text_rw, " .,;:-!?");

    char word_to_return[strlen(text)];
    int  word_frequence = 0;

    while (p != NULL) {
      if (strlen(p) >= 0) {
        int offset = p - text;
        int count = count_word(p, text);

        if (word_frequence < count) {
          strcpy(word_to_return, p);          
          word_frequence = count;
        }
      };

      p = strtok(NULL, " .,;:-!?");
    }

    free(text_rw);
    struct stat_mot word = { word_to_return, word_frequence };
    return word;
}
4

8 回答 8

5

至少,您需要将 frequence.c 的定义stat_mot移至 frequence.h。main()尝试创建它的实例,如果没有结构定义,您将无法做到这一点。

还有一些其他问题:

  • 我很难相信char*和之间的类型不匹配char(*)[34]可以通过将所有内容放入一个文件中来解决。因此,我希望该修复与您将代码组织到文件中无关,只是您应该通过texte,而不是&texte.
  • “空声明中的无用存储类说明符” - 是一个令人困惑的错误消息,但它的出现是因为在 C 语法typedef中是一个存储类说明符。不要问为什么。基本上,typedef struct stat_mot;是错误的,但这没关系,因为您可以在移动结构定义时将其删除。
于 2012-10-11T12:18:48.370 回答
3

您的结构定义必须在标题中。

于 2012-10-11T12:18:31.257 回答
1

头文件只对定义有用——例如编译确实有效,但链接器不知道在哪里寻找函数的主体。

尝试编译gcc main.c frequence.c

另外,typedef struct stat_mot;没有太多意义——struct stat_mot此时没有定义,而且,你没有用 this 给它一个新名称typedef。我认为即使允许分离结构定义也没有意义 - 毕竟,如果你只是分发头文件,人们应该知道如何使用结构(例如,看看它包含什么)

于 2012-10-11T12:19:37.610 回答
1

您在头文件中声明结构(前向声明),但在源文件中定义它。因此它不能从.stat_motfrequence.cmain.c

于 2012-10-11T12:20:14.853 回答
1

只需将结构声明放入头文件即可:

/* in frequence.h */
struct stat_mot {
    char* word;
    int frequency;
};

所以两个翻译单元(即.c文件)都能看到它。

于 2012-10-11T12:20:21.057 回答
1

你必须把你的stat_mot结构放在frequence.h.

此外,main()应该声明为

int main(int argc, char **argv)

并且texte应该是char *

int main(char *argv[])
{
    char *texte = ";! one two, tree foor one two !:;";
    struct stat_mot word = show_all_words(texte);

您还应该包含<string.h>and <stdlib.h>frequence.c因为您使用strstr,strlenfree

In frequence.c,strlen总是大于或等于零,所以比较总是正确的。

于 2012-10-11T12:28:27.823 回答
0

struct stat_mot需要在头文件中定义或者使用指针。

哦,(虽然这不是问题)

typedef struct stat_mot;

您需要像这样指定第二种类型的名称:

typedef struct stat_mot stat_mot;

于 2012-10-11T12:20:26.097 回答
0

也许你应该写这个

typedef struct stat_mot stat_mot;

在你的 frequence.h 中,然后

typedef struct stat_mot {
    char * word;
    int frequency;
};

在 .c 文件中。

.h文件只是数据文件或方法的声明,但你应该清楚地声明它。

提示:不需要 ; 在 main(){} 的末尾;

于 2012-10-12T03:11:15.833 回答