所以我的struct数组有点问题没有按照它应该做的那样。在构建程序时,我没有收到编译器警告或错误。
int Array_Size=0;;
int Array_Index=0;
FILE *Writer;
struct WordElement
{
int Count;
char Word[50];
};
struct WordElement *StructPointer; //just a pointer to a structure
int Create_Array(int Size){
StructPointer = (struct WordElement *) malloc(Size * sizeof(StructPointer));
Array_Size = Size;
return 0;
}
int Add_To_Array(char Word[50]){
int Word_Found=0;
for(int i=0; i <= Array_Size && Word_Found!=1; i++)
{
if(strcmp(StructPointer[i].Word, Word)) // This should only run if the word exists in struct array
{
StructPointer[i].Count++;
Word_Found=1;
}
}
if(Word_Found==0) // if the above if statement doesnt evualate, this should run
{
strcpy(StructPointer[Array_Index].Word, Word); //copying the word passed by the main function to the struct array at a specific index
printf("WORD: %s\n", StructPointer[Array_Index].Word); // printing it just to make sure it got copied correctly
Array_Index++;
}
return 0;
}
int Print_All(char File_Name[50])
{
Writer = fopen(File_Name, "w");
printf("Printing starts now: \n");
for(int i=0; i < Array_Size; i++)
{
fprintf(Writer, "%s\t\t%d\n",StructPointer[i].Word, StructPointer[i].Count);
}
free(StructPointer);
return 0;
}
从不同的文件调用这些函数,当程序从文本文件中读取新单词时,将调用Add_To_Array。该函数应该检查结构数组中是否已存在该单词,如果确实存在,则应该只增加计数器。如果没有,则添加它。
在所有单词存储在struct数组中之后调用Print_All函数。它应该循环遍历它们并打印每个单词及其出现。在文本文件中,每个单词中有2个,但我的程序输出:
this 13762753
document -1772785369
contains 1129268256
two 6619253
of 5701679
every 5570645
word 3342389
doccontains 5374021
我不知道该怎么做,因为我对C编程来说真的很新......可能值得一提的是if(Word_Foun == 0)没有执行
答案 0 :(得分:3)
StructPointer = malloc(Size * sizeof(*StructPointer));
这将是正确的分配。否则,您的代码中将出现错误行为。同时检查malloc
的返回值。
StructPointer = malloc(Size * sizeof(*StructPointer));
if(NULL == StructPointer){
perror("malloc failure");
exit(EXIT_FAILURE);
}
您正在为struct WordElement
分配而不是指向它的指针。您已经有一个指向struct WordElement
的指针,您需要的只是struct WordElement
的内存。
同样在循环中,您正在访问超出绑定的数组索引
for(int i=0; i <= Array_Size && Word_Found!=1; i++)
^^^
它将是i < Array_Size
。
如果发生匹配,您希望将变量Word_found
设置为1
。
if(strcmp(StructPointer[i].Word, Word) == 0){
/* it macthed */
}
另外Writer = fopen(File_Name, "w");
您应该检查fopen
的返回值。
if(Writer == NULL){
fprintf(stderr,"Error in file opening");
exit(EXIT_FAILURE);
}
此外,当您增加Array_index
位置时,请检查它是否可以访问数组索引。
用于实现小任务的全局变量越多,就越难以追踪错误。它始终存在问题,因为数据可能会发生变化的地方分散 - 使其难以管理。