Как вернуть строку из функции, когда строка находится в массиве - PullRequest
0 голосов
/ 20 сентября 2019

Я кодирую игру, в которой мне нужно сохранить слово в массиве, после чего функция возвращает это слово.В моем случае слово "control", имя массива mot_generer и имя функции initialisation_mot_a_trouver.

Я пытался использовать код возврата mot_generer, но у меня естькод ошибки ниже:

jeu_pendu.c: в функции 'initialisation_mot_a_trouver': jeu_pendu.c: 82: 10: предупреждение: return возвращает целое число из указателя без приведения [-Wint-преобразование] return mot_generer;

char initialisation_mot_a_trouver(){  
    char mot_generer[]="controle";  
    return mot_generer;
}

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Ваша функция сообщает, что вернет символ, но на самом деле вы возвращаете символ *.

char* initialisation_mot_a_trouver(){  

    char mot_generer[]="controle";  

    return mot_generer;

}

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

char* initialisation_mot_a_trouver(){  
    char mot_generer[]="controle";
    char *pszNamePtr = calloc(strlen(mot_generer) + 1, sizeof(char));
    strncpy(pszNamePtr, mot_generer, strlen(mot_generer);

    return pszNamePtr;

}

Или проверить ответ Пол Огилви для другого подхода.

0 голосов
/ 20 сентября 2019

В функции есть две ошибки.

Первая состоит в том, что массивы в выражениях неявно преобразуются в указатели на типы элементов массивов.

Так что, если функция возвращаетвыражение

return mot_generer;

, где mot_generer - массив, тогда тип возвращаемого значения функции должен быть char *.

Вторая ошибка состоит в том, что функция (правильно объявленная) возвращает указатель на локальныймассив с автоматической продолжительностью хранения, который не будет определен после выхода из функции.

Так что либо объявите массив в функции как имеющий статическую продолжительность хранения, например

char * initialisation_mot_a_trouver(){  

    static char mot_generer[]="controle";  

    return mot_generer;
}

, либо выделите массивдинамически, как

char * initialisation_mot_a_trouver()
{
    const char *literal = "controle";

    char *s = malloc( strlen( literal ) + 1 );

    if ( s != NULL ) strcpy( s, literal );

    return s;
}

Третий подход - передать функции уже созданный массив в main.

В этом случае функция может выглядеть как

char * initialisation_mot_a_trouver( char s[], size_t n )
{
    strncpy( s, "controle", n );
    s[n -1] = '\0';

    // or for example
    // fgets( s, n, stdin );
    // s[ strcspn( s, "\n" ) ] = '\0'; 

    return s;
}
0 голосов
/ 20 сентября 2019

Смотрите мои комментарии.Правильная версия будет:

char *initialisation_mot_a_trouver()
{  
    char *mot_generer= malloc(strlen("controle")+1);
    strcpy(mot_generer, "controle");
    return mot_generer;
}

Вызывающий должен free() возвращаемая строка.

...