web-dev-qa-db-fra.com

Renvoie char []/string à partir d'une fonction

Je suis assez nouveau pour coder en C et je suis actuellement en train de créer une fonction qui retourne un tableau c/string et de l’affecter à une variable.

Jusqu'à présent, ive observé que le retour d'un caractère * est la solution la plus courante. Alors j'ai essayé:

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char str[3];
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    char* cp = str;
    return cp;
}

Ma question est la suivante: comment utiliser ce char* renvoyé et affecter le tableau de caractères sur lequel il pointe, à une variable char []?

J'ai essayé (tout a conduit à des erreurs de noyade):

  1. char* charP = createStr();
  2. char myStr[3] = &createStr();
  3. char* charP = *createStr();
23
user1993177

Notez que vous n'allouez pas la variable de manière dynamique, ce qui signifie que les données contenues dans str, dans votre fonction, seront perdues à la fin de la fonction.

Tu aurais dû:

char * createStr() {

    char char1= 'm';
    char char2= 'y';

    char *str = (char *) malloc(sizeof(char) * 3);
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';

    return str;

}

Ensuite, lorsque vous appelez la fonction, le type de la variable qui recevra les données doit correspondre à celui de la fonction return. Donc, vous devriez avoir:

char *returned_str = createStr();
31
Rubens

Si vous voulez renvoyer un char* à partir d'une fonction, assurez-vous de le malloc(). Les tableaux de caractères initialisés en pile n'ont aucun sens à retourner, car y accéder après le retour de cette fonction est un comportement non défini.

changez le en

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char *str = malloc(3 * sizeof(char));
    if(str == NULL) return NULL;
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    return str;
}
5
Aniket Inge
char* charP = createStr();

Serait correct si votre fonction était correcte. Malheureusement, vous retournez un pointeur sur une variable locale dans la fonction, ce qui signifie qu'il s'agit d'un pointeur sur des données non définies dès le retour de la fonction. Vous devez utiliser l'allocation de tas, comme malloc, pour la chaîne dans votre fonction, afin que le pointeur que vous renvoyez ait une signification. Ensuite, vous devez vous rappeler de le libérer plus tard.

5
Paulpro

Inclure "string.h" facilite les choses. Un moyen plus facile de résoudre votre problème est le suivant:

#include <string.h>
    char* createStr(){
    static char str[20] = "my";
    return str;
}
int main(){
    char a[20];
    strcpy(a,createStr()); //this will copy the returned value of createStr() into a[]
    printf("%s",a);
    return 0;
}
1
Adnan

vous pouvez utiliser un tableau statique dans votre méthode, pour éviter de perdre votre tableau lorsque votre fonction se termine:

char * createStr() {

char char1= 'm';
char char2= 'y';

static char str[3];  
str[0] = char1;
str[1] = char2;
str[2] = '\0';

return str;

}

0
A.salehy