c数组malloc未知大小

时间:2014-07-23 05:44:08

标签: c arrays pointers malloc

在处理输入文件之前,如何在不知道有多少字符串的情况下创建一个唯一字符串数组?可以有多达200万个字符串,最大长度为50。 我的程序是这样的。这适用于51项,然后覆盖其他数据。如果可能的话,我不知道如何向数组添加元素。

main() {

    char *DB_NAMES[51]; // i thought this gave me ptrs to chunks of 51
                // but it's 51 pointers!
    char *word;

    while not eof {
        ...function to read big string 
        ...function to separate big sting into words
        ...
        processWord(ctr, DB_NAMES, word);
        ...
    }
}

processWord(int ndx, char *array1[], char *word){

    ...function to find if word already exists...

    //if word is new, store in array 
        array1[ndx]= (char *)malloc(sizeof(51)); // isn't this giving me a char[51]?    
        strcpy(array1[ndx],word);
    ...
}

2 个答案:

答案 0 :(得分:0)

您可以使用以下逻辑首先获取文件中的单词数,当您获得文件中的单词数时,可以使用单词count初始化数组大小。

#include<stdio.h>
#define FILE_READ "file.txt"

int main()

{
    FILE * filp;
    int count = 1;
    char c;
    filp = fopen(FILE_READ, "r");
    if(filp == NULL)
        printf("file not found\n");
    while((c = fgetc(filp)) != EOF) {
        if(c == ' ')
            count++;
    }
    printf("worrds = %d\n", count);
    return 0;
}

此致 yanivx

答案 1 :(得分:0)

最好不要使用固定的字符串长度;节省内存空间。

    char **DB_NAMES = 0;    // pointer to first char * ("string") in array; initially 0

通过引用传递指针,以便可以更改它。此外,如果存储了新单词,您将需要新的ctr值。

        ctr = processWord(ctr, &DB_NAMES, word);

相应地更改功能processWord

int processWord(int ndx, char ***array1a, char *word)
{   char **array1 = *array1a;
    ...function to find if word already exists...

    // if word is new, store in array
    {
        array1 = realloc(array1, (ndx+1)*sizeof*array1);    // one more string
        if (!array1) exit(1);                               // out of memory
        array1[ndx++] = strdup(word);                       // store word's copy
        *array1a = array1;                                  // return new array
    }
    return ndx;                                             // return count
}