Динамическая структура массива строк в C - PullRequest
3 голосов
/ 13 февраля 2011

Мне нужно написать функцию в c, которая будет возвращать динамический массив строк. Вот мои требования:

  • У меня есть 10 различных функций исследования, которые будут возвращать либо истину, либо ложь, и связанный текст ошибки. (текстовая строка ошибки также является динамической).
  • Моя функция должна собирать результат (true или false) + строку ошибки, и она будет называться n проверять функции. Поэтому моя функция должна собрать n результатов и, наконец, вернуть динамический массив строк другим функциям.

Ответы [ 3 ]

1 голос
/ 13 февраля 2011

Вы можете выделить массив произвольной длины с помощью malloc () (это как «новый» в Java), а также увеличить или уменьшить его с помощью realloc ().

Вы должны помнить, чтобы освободить память с помощью free (), так как в C нет сборщика garbarage.

Проверка: http://www.gnu.org/software/libc/manual/html_node/Memory-Allocation.html#Memory-Allocation

Edit:

#include <stdlib.h>
#include <string.h>
int main(){
    char * string;
    // Lets say we have a initial string of 8 chars
    string = malloc(sizeof(char) * 9); // Nine because we need 8 chars plus one \0 to terminate the string
    strcpy(string, "12345678");

    // Now we need to expand the string to 10 chars (plus one for \0)
    string = realloc(string, sizeof(char) * 11);
    // you can check if string is different of NULL...

    // Now we append some chars
    strcat(string, "90");

    // ...

    // at some point you need to free the memory if you don't want a memory leak
    free(string);

    // ...
    return 0;
}

Редактировать 2: Это пример для выделения и расширения массива указателей на символы (массив строк)

#include <stdlib.h>
int main(){
    // Array of strings
    char ** messages;
    char * pointer_to_string_0 = "Hello";
    char * pointer_to_string_1 = "World";
    unsigned size = 0;

    // Initial size one
    messages = malloc(sizeof(char *)); // Note I allocate space for 1 pointer to char
    size = 1;

    // ...
    messages[0] = pointer_to_string_0;


    // We expand to contain 2 strings (2 pointers really)
    size++;
    messages = realloc(messages, sizeof(char *) * size);
    messages[1] = pointer_to_string_1;

    // ...
    free(messages);

    // ...
    return 0;
}
0 голосов
/ 02 мая 2011
  1. У вас есть некоторые ограничения по прототип examine() функция и функция у вас есть написать ? (давайте назовем это validate())

  2. Вы говорите, что у вас есть 10 examine() функций, означает ли это, что вы получите максимум 10 сообщений / результатов в массиве, возвращаемом validate()?

Я программист на Java с фоном C, поэтому, возможно, я могу выделить несколько вещей для вас:

  • нет эквивалента Array.length в C: вам нужно указать боковое целое значение для хранения эффективного размера вашего массива

  • Массивы C не могут «расти»: вам придется использовать указатели и выделять / перераспределять память, указанную указателем начала массива, по мере увеличения или уменьшения этого массива

  • вы уже должны знать, что в C нет понятия класса или метода, однако вы можете использовать struct, typedef и указатели на функции, чтобы добавить какое-либо объектно-ориентированное поведение / поведение универсальности в свои программы на C ...

  • В зависимости от ваших потребностей и обязательств, массивы могут быть хорошим способом или нет: возможно, вам следует попытаться найти способ построения / поиска эквивалента интерфейса Java-списка в C, чтобы Вы можете добавлять, удалять / уничтожать или сортировать элементы результатов исследования без необходимости дублировать код выделения / перераспределения / освобождения памяти каждый раз, когда вы манипулируете своим набором результатов (и, возможно, вам следует отправить файл заголовка с вашими структурами / функциями проверки, чтобы описать, что вы сделали сейчас, во всяком случае, и изложите ваши потребности немного точнее, чтобы мы могли направить вас в правильном направлении)

Не стесняйтесь предоставить дополнительную информацию или спросить о конкретных пунктах вышеупомянутых пунктов;)

0 голосов
/ 13 февраля 2011

Рассмотрите возможность создания подходящих типов, подходящих для вашей проблемы.Например, вы можете создать структуру, содержащую указатель и целую длину sn для представления динамических массивов.

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