c Struct Array,存储字符串及其出现位置并将其写入文件

时间:2018-02-21 21:02:37

标签: c arrays loops struct c-strings

所以我的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)没有执行

1 个答案:

答案 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位置时,请检查它是否可以访问数组索引。

用于实现小任务的全局变量越多,就越难以追踪错误。它始终存在问题,因为数据可能会发生变化的地方分散 - 使其难以管理。