Renvoyer une chaîne de fonction

J’essaie de faire une fonction de sous-chaîne sur c. Ce doit être return “cdef”, mais ça ne retourne rien. Comment puis-je résoudre ce problème? Merci.

#include #include #include char* subssortingng( char *, int, int ); int main(){ char stuff[] = "abcdefghjklmnoprstuvyz"; printf("%s\n", stuff); printf("%s\n", subssortingng(stuff, 2, 6)); getch(); return 0; } char* subssortingng(char *text, int a, int b){ char nText[ba]; char tmp[2]; strcpy(nText, ""); for(int i=a; i<b; i++){ tmp[0] = text[i]; tmp[1] = '\0'; strcat(nText, tmp); } return nText; } 

Vous faites l’erreur de renvoyer un pointeur sur une variable qui peut ne plus exister après le retour de la fonction. Vous devez allouer de l’espace dans la fonction appelante et simplement mettre le résultat dans l’espace prévu ou créer un espace permanent dans la fonction avec static . Remarque – comme l’a souligné Jonathan Leffler -, comme l’espace est “permanent”, vous ne pouvez pas modifier la longueur du bloc d’un appel à l’autre et vous devez choisir une valeur “raisonnable” et tester que b-a+1 n’est pas plus long que l’espace alloué. Ainsi, ma deuxième méthode est plus robuste.

 char* subssortingng(char *text, int a, int b){ static char nText[100]; if ((b-a+1)>100) // do something! you can't copy this! // code return nText; } 

Comme Employed Russian l’a fait remarquer, utiliser un statique de cette manière est en tout cas assez dangereux, car un autre morceau de code pourrait appeler cette fonction pendant que vous utilisez toujours le résultat du premier appel. Ce n’est pas conseillé si vous faites plusieurs types de threads, mais c’est une solution rapide si vous avez un seul thread.

Une meilleure formulation est

 void subssortingng(char *text, int a, int b, char *nText) { // code, nothing to return } 

Dans ce dernier cas, vous créez un espace dans la fonction appelante et passez le pointeur sur la subssortingng . vous auriez votre programme principal

 char shortSsortingng[100]; subssortingng(stuff, 4, 6, shortSsortingng); printf("%s\n", shortSsortingng); 

En passant, votre méthode de copie de la sous-chaîne est terriblement inefficace. Envisagez de le remplacer par

 for(int i=a; i 

A partir de cela, vous pouvez voir que vous devez réellement affecter des éléments nText[b-a+1] , sinon il n'y a pas d'espace pour le '\0' final.

Votre bug est ici:

 char* subssortingng(char *text, int a, int b){ char nText[ba]; ... return nText; } 

Le tampon que vous retournez devient invalide dès que vous revenez de la fonction.

GCC vous en avertit gentiment:

 tc:24:5: warning: function returns address of local variable [enabled by default] 

Comment puis-je résoudre ce problème?

Vous devez allouer un nouveau tampon (et l’appelant devra le libérer) ou demander à l’appelant de fournir un tampon de sortie (comme suggéré par Floris).

 #include  #include  #include  char* subssortingng( char *, int, int ); char* subssortingngb(char *substr, char *text, int a, int b); int main(){ char stuff[] = "abcdefghjklmnoprstuvyz"; char substr[5]; printf("%s\n", stuff); printf("%s\n", subssortingng(stuff, 2, 6));//Things to think to be able to release! printf("%s\n", subssortingngb(substr, stuff, 2, 6)); getch(); return 0; } //dynamic allocate char* subssortingng(char *text, int a, int b){ char *nText; nText = (char*)malloc((b-a+1)*sizeof(char)); strncpy(nText, &text[a], ba); ntext[ba] = 0; return nText; } //copy to reserve area char* subssortingngb(char *substr, char *text, int a, int b){ substr[ba]=0; return strncpy(substr, &text[a], ba); }