Вернуть "char * tab []" в функцию C - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создать функцию, которая возвращает char *tab[] для заполнения char *tab1[]

#include <stdio.h>
#include <string.h>
char * fill(){
        char *tab[2];
        tab[0] = "text 1";
        tab[1] = "text 2";
        return tab;
}

int main(){
        char *tab1[2];
        tab1 = fill();
        return 0;
}

Я пытался использовать strcpy, strncpy, возвращать char **, malloc.Я могу копировать только индекс за раз, например tab1 [0] = tab [0], но мне нужно вернуть полный массив за один раз.

Я использую рекурсивную функцию для заполнения вкладки *] и для этого мне нужно объединить некоторые строки и переменную:

void fill(int n, char *x, char *y, char *z, char *tab[]){
        int i;
        char text[40];
        if(n == 1){
                strcpy(text, "text 1 ");
                strcat(text, x);
                strcat(text, " text 2 ");
                strcat(text, y);

                tab[0] = text;
        } else if(tab[n-1] == ""){
                strcpy(text, "text 1 ");
                strcat(text, x);
                strcat(text, " text 2 ");
                strcat(text, z);
                strcat(text, "\ntext 1 ");
                strcat(text, z);
                strcat(text, " text 2 ");
                strcat(text, y);

                tab[n-1] = text;
                if(n-1 > 1){
                        fill(n-1, x, z, y, tab);
                }
        }
}

И в завершение мне нужно вернуть вкладку [], чтобы заполнить другую вкладку в основном:

int main(){
            int n = 2;
            char *tab1[n];
            fill(n, "a", "b", "c", tab1);
            return 0;
    }

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

У вас есть несколько проблем в вашем существующем коде.Во-первых, здесь:

        int n = 2;
        char *tab1[n]; /* here, the contents of tab1 are unspecified  */
        fill(n, "a", "b", "c", tab1); /* so here, you can't read them */

То есть, когда fill делает

   } else if(tab[n-1] == ""){

, предполагается, что tab[1] (при первом вызове) - это то, что вы можете прочитать на законных основаниях.Это не так, потому что вы никогда ничего не кладете туда.

Вы определенно не можете предполагать, что оно указывает на строковый литерал "", и вы также не можете предполагать, что оно указывает на любое разыменованное местоположение(так что вы не можете писать !*tab[n-1] или !strcmp(tab[n-1], "") или что-то еще.)

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

Далее у вас есть другая проблема: назначаемые вами значения являются указателями на локальный массив символов с автоматическим временем жизни: text.Все они выходят из области видимости, когда функция возвращается, и тогда запрещено разыменовывать любые элементов в tab1.Изменение назначений, например, на

tab[n-1] = strdup(text);

, исправит это, но имейте в виду, что вызывающий абонент несет ответственность за free каждый элемент.

0 голосов
/ 28 сентября 2018

Во-первых, ваша таблица является локальной для функции и не существует вне области действия функции.

Во-вторых, таблица не является указателем. Вы не можете использовать таблицу в качестве указателя и назначить ее в основных функциях, как и вы.

char ** fill()
{
        char **tab = malloc(2 * sizeof (*tab));
        tab[0] = "text 1";
        tab[1] = "text 2";
        return tab;
}

int main()
{
        char **tab1;
        tab1 = fill();
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...