以下程序存储每个单词,然后用一些出现次数打印它们。
全球typedef
声明:函数在结构数组中搜索 - 停止条件未知
typedef struct {
char * word;
int occ;
}
words;
words *data=NULL;
我有搜索功能的问题。我创建了一个函数返回int
,看起来像这样:(max
是结构数组的不断更新的大小,这就是为什么我把搜索功能达到EOF
后)。
int search(char *word,int max)
{
int i;
for(i=0; i<max; i++)
{
if(!strcmp(data[i].word,word)) return i;
}
return -1;
}
但是我注意到我中号应该写具有原型搜索功能:
struct abc *find(char *word)
所以我创建了下面的代码:
struct words *findword(char *word)
{
struct words *ptr;
for (ptr = data; ptr != NULL; ptr++) { /* IS THE STOP CONDITION OK? */
if (strcmp(word, ptr->word) == 0)
return ptr;
}
return NULL;
}
我在编译过程中收到许多错误:
reverse.c: In function ‘findword’:
reverse.c:73: warning: assignment from incompatible pointer type
reverse.c:73: error: increment of pointer to unknown structure
reverse.c:73: error: arithmetic on pointer to an incomplete type
reverse.c:74: error: dereferencing pointer to incomplete type
reverse.c: In function ‘main’:
reverse.c:171: error: ‘which’ undeclared (first use in this function)
reverse.c:171: error: (Each undeclared identifier is reported only once
reverse.c:171: error: for each function it appears in.)
make: * [reverse.o] Error 1
which
是分配给我首先写的搜索功能返回的int
变量。 与which
该错误很容易固定,但我不知道如何替换(解决方案与我的基本搜索功能工作):
data[which].occ++;
如何解决此问题,以便它会与我的工作新的搜索方法?
编辑
main()
补充说:
int main(int argc, char **argv)
{
char *word;
words *temp;
int c,i,num;
/*int which;*/
FILE *infile;
if(argc!=2) {}
if((infile=fopen(argv[1],"r"))==NULL) {}
num=0;
while(1)
{
c=fgetc(infile);
if(c==EOF) break;
if(!isalpha(c)) continue;
else ungetc(c,infile);
word=getword(infile);
word=convert(word);
/*which=search(word,num);*/
if(findword(word))
{
if(!(temp=realloc(data,sizeof(words)*(num+1))))
{}
else
data=temp;
data[num].word=strdup(word);
data[num].occ=1;
num++;
}
else
data[which].occ++;
free(word);
}
sort(num-1);
for(i=0;i<num;i++)
{}
free(data);
if(fclose(infile))
{}
return 0;
}
我已经离开{}
代码例如无关件。错误处理。
EDIT2 我所要求的上面的事,是固定的。但是,我现在遇到了seg故障。 我给一个链接到整个代码,我不想把它放在一个编辑的文章,因为它会造成一个大混乱。 Seg故障由第73行和第152行引起(strcmp无法正常工作)。希望完整的代码更容易理解。 FULL CODE
为什么不只需将该'int max'参数移动到一个全局变量并使用第一个版本的代码?第二个版本将会崩溃,因为指针将会增加并增加超过'data []'数组的末尾。 –
@AlexeyFrunze我不能使用第一个函数,因为它返回'int',我应该返回结构数组中的特定位置。 Ad.2 - 如何解决这个问题,以便指针在不断扩大的结构数组结尾处停止递增? –
返回'&data [i]'而不是'i',那有什么问题?除了1)引入元素计数器(或指向最后一个元素的指针)并将当前检查的位置与该OR进行比较(我不建议这样做)之外,您不能修复该指针,2)将特殊指示符嵌入到数据[]的最后一个元素并检查它。 –