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