创建动态数组以保存多个单词

时间:2013-12-01 17:05:13

标签: c arrays

大家好,我正在做一个与我的课程相关的C项目。我需要定义一个动态数组来保存单词,单词数可能非常大,为700万,但字长最多为100个字符。我创建了动态数组:

char (*words)[1001];
words = (char (*)[1001]) malloc(sizeof(*words));

我正在为这个数组添加单词:

while(!feof(mergefile))
    {
        if (EOF!=fscanf(mergefile,"%s",word)){
            strcpy(words[index] , word);
            index++;
        }
    }

但是当我尝试添加许多单词时,我会遇到分段错误。我的问题是,我怎样才能正确创建这个数组来保存很多单词?

请帮助我,因为时间有限,谢谢..

2 个答案:

答案 0 :(得分:1)

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

int main(void){
    char **words = malloc(7000000*sizeof(char*));
    if(words){
        FILE *mergefile = stdin;//mock
        char word[100+1];
        size_t index = 0;

        while(!feof(mergefile)){
            if(EOF!=fscanf(mergefile, "%100s", word)){
                words[index]=malloc(strlen(word)+1);
                if(words[index]==NULL){
                    puts("I can't continue ...\n");
                    exit(-1);
                }
                strcpy(words[index++], word);
            }
        }
        words = realloc(words, index*sizeof(char*));
        int i;
        for(i=0;i<index;++i){
            puts(words[i]);
            free(words[i]);
        }
        free(words);
    } else {
        puts("I can't...\n");
    }
    return 0;    
}

答案 1 :(得分:1)

似乎你试图声明words是一个指向1001个字符串数组的指针,我认为这是在声明中给你带来麻烦的一部分。我建议改为以这种方式声明words

char **words;
words = malloc(number_of_words * sizeof(char *));

并将循环写入strdup每个单词而不是strcpy

while(!feof(mergefile))
{
    if (EOF!=fscanf(mergefile,"%s",word)){
        words[index] = strdup(word);
        index++;
    }
}