заполнять динамически распределяемый массив строк? - PullRequest
2 голосов
/ 25 марта 2012

У меня есть следующий код для заполнения массива строк, но каждый раз, когда я меняю значение, меняется весь массив (вместо одной строки массива)

Ответы [ 3 ]

4 голосов
/ 25 марта 2012

Это потому, что у вас одинаковый указатель на char для всех позиций массива.

Когда вы делаете:

words[i] = txt;

Вы назначаете указатель. Таким образом, каждый word[i] является одной и той же строкой (txt). Если вы действительно хотите прочитать слово в буфер (например, txt) и затем поместить его в массив строк, вам необходимо скопировать содержимое строки буфера в строку в массиве, например:

strncpy(words[i], txt, MAX_WORD_LENGTH);

Существует также другая проблема с вашим кодом, которая заключается в распределении массива строк. Должно быть:

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

Это потому, что строковый массив является указателем на указатель на символ (char**), а каждый элемент массива является строкой (char*). Теперь вы выделили массив указателей на символы, но не распределили память для каждой строки, что мы и делаем дальше:

for (i = 0; i < wordcount; i++) {
    words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char));
}

Если вы не хотите использовать буфер и читать непосредственно в строковый массив, ваш код будет выглядеть примерно так:

words = (char**)malloc(wordcount * sizeof(char*));
input = fopen(filename, "r");
while(!feof(input)) {
    words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char));
    fscanf(input, "%s", words[i]);
}
1 голос
/ 25 марта 2012

Вам нужно выделить место для каждого слова и скопировать строку в это выделенное место:

input = fopen(filename, "r");
while(!feof(input)){
    if(fscanf(input,"%s", txt)){
        /* malloc for word here */
        words[i] = malloc(strlen(txt)+1);
        strcpy(words[i], txt); //<---Problem line right here
        ++i;
    }
}
0 голосов
/ 25 марта 2012

Проблема с этим фрагментом кода заключается в том, что вы выделили один буфер для получения строковых данных из fscanf.Каждый раз, когда строка читается из файла, она помещается в текстовый буфер.Каждый указатель в массиве слов указывает на txt.Таким образом, в конце операции у вас есть много указателей, которые указывают на один и тот же буфер, который содержит одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...