0

我在动态分配时遇到问题。我的程序需要接收一个文本文件,接收每个单词,并将它们放入一个数组中,同时计算重复的单词。我认为我将单词正确地分配到数组中,但是我不明白如何使用我使用动态分配创建的结构创建数组。即它需要像列表一样增长。感谢你给与我的帮助。我注释掉的领域也是麻烦的领域。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef unsigned int uint;

typedef struct wordType
{
    char * word;
    uint count;
};



/* store the string in another temp string which you can iterate through
and compare with the array of non-repeated words.  if there, increment*/


int main( void ) 
{
    typedef struct wordType * WORD_RECORD;
    WORD_RECORD arrayOfWords = malloc(10 * sizeof( WORD_RECORD) );

    FILE * inputFile;
    char temp[50];
    uint i;
    uint j;
    uint size;
        uint exists;
        inputFile = fopen( "input.txt", "r");



    if( inputFile == NULL )
    {
        printf( "Error: File could not be opened" );
        /*report failure*/
        return 1;
    }   
    i = 0;
    size = 0;
    while( fscanf( inputFile, "%s", temp) == 1 )
    {
        exists = 0;
        for( j = 0; j < size; j++ )
        {
            if( strcmp( arrayOfWords[j].word, temp ) == 0 )
            {
                arrayOfWords[j].count++;
                exists = 1;
            }
        }
        if( exists == 0 )
        {
            arrayOfWords[i].word = malloc(sizeof(char) 
                                    * (strlen(temp)+1));
            strcpy( arrayOfWords[i].word, temp );
            /*arrayOfWords[i].count++;*/
            size++;
        }
        i++;
    }

    for( i = 0; i < (size-1) ; i++ )
        printf("%s\n", arrayOfWords[i].word);


    fclose( inputFile );
    /*for( i = 0; i < size-1; i++ )
        free( arrayOfWords[0].word );*/
    return 0; 
}   
4

1 回答 1

2

您似乎malloc()正确使用来初始化您的 arrayOfWords 数组。您可以使用该函数来增加数组realloc(),但您必须跟踪它有多大,无论您有多少单词,这样您就会知道何时调用realloc(). 在 的情况下if ( exists == 0 ),变量arrayOfWords[i].count还没有被初始化,所以假设它为零是一个错误,试图增加它是一个错误,并且除了将其设置为显式值(在这种情况下,0)之外的任何东西都是一个漏洞。

您似乎在i计算您已阅读的单词总数,而不是您已阅读的唯一单词,因此i在打印单词时用作循环计数器也是错误的。当你释放malloc()'ed 单词时也是如此:使用i作为循环计数器意味着你最终得到了free()你没有从中得到的东西malloc()

要动态增加单词列表的存储空间,您需要跟踪struct wordType已分配存储空间的项目数量,并在添加新单词时检查是否已达到限制以及realloc()是否有必要。

当循环打印(和释放)单词时,你为什么要做“size - 1”?

于 2013-04-30T02:02:19.993 回答