(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
main.c
#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;
}
至少,您需要将
stat_mot
的定义从 frequence.c 移至 frequence.h。 main()
尝试创建它的实例,如果没有结构定义,则无法执行此操作。
还有其他一些问题:
char*
和 char(*)[34]
之间的类型不匹配可以通过将所有内容放入一个文件中来解决。所以我希望修复与您将代码组织到文件中无关,只是您应该通过 texte
,而不是 &texte
。typedef
是一个存储类说明符。别问为什么。基本上,typedef struct stat_mot;
是错误的,但这没关系,因为当您移动结构定义时,您无论如何都可以删除它。您的结构定义必须位于标头中。
您必须将您的
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>
中包含 <stdlib.h>
和 frequence.c
,因为您使用 strstr
、strlen
和 free
。
在
frequence.c
中,strlen
始终大于或等于 0,因此比较始终为 true。
标题仅适用于定义——例如编译确实有效,但链接器不知道在哪里寻找函数体。
尝试使用
gcc main.c frequence.c
进行编译
此外,
typedef struct stat_mot;
没有多大意义——此时struct stat_mot
尚未定义,而且,您也没有用这个typedef
给它一个新名称。
我认为即使允许,分离结构定义也没有意义 - 毕竟,如果您只是分发头文件,人们应该知道如何使用该结构(例如查看它包含的内容)
您在头文件中声明结构
stat_mot
(前向声明),但您在源文件frequence.c
中定义它。因此它无法从
main.c
使用。
只需将结构体声明放入头文件即可:
/* in frequence.h */
struct stat_mot {
char* word;
int frequency;
};
因此两个翻译单元(即
.c
文件)都能看到它。
struct stat_mot
需要在头文件中定义或者使用指针。
哦还有(虽然这不是问题)
typedef struct stat_mot;
您需要指定第二种类型名称,如下所示:
typedef struct stat_mot stat_mot;
也许你应该写这个
typedef struct stat_mot stat_mot;
以您的频率。h 然后
typedef struct stat_mot {
char * word;
int frequency;
};
在.c文件中。
.h文件只是数据文件或方法的声明,但你应该声明清楚。
提示:不需要 ;在 main(){} 的末尾;