Salut à tous.
Après avoir réaliser une fonction similaire à la fonction prédefinie "strchr", je me rend compte qu'une erreur bizarre surgit si je met la taille de la chaine 50. Pourtant je suis toujours loin de la dépasser. Et il y a aussi un Warning qui me dit qu'il est interdit de retourner une variable locale. Je ne comprend pas...
Voiçi le code commenté de la fonction :
char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
{
long i = 0, j = 0;
char ch2[50]; // Si on change ici 50 par 100 le programme fonctionne
while (ch[i] != c && ch[i] != '\0') // Tant que (c n'est pas trouvée ET non(fin de ch))
i++;
if (ch[i] == c) // Si (lettre trouvée)
{
while (ch[i] != '\0') // On remplit la chaine ch2(de j = 0) par ch(depuis i = la position de la lettre trouvée)
{
ch2[j] = ch[i];
i++;
j++;
}
ch2[j] = '\0';
return ch2;// Sans oublier le symbole de fin de chaîne
}
else // Sinon si (fin de ch atteinte)
return 0; // On retourne NULL
}
comme dit ice_keese, ch est détruit en sortant de ta fonction : son adresse devient invalide.
Conseil :
construit ch2 dynamiquement, avec un malloc. Dans ce cas la, tu retournes le pointeur, et la chaine reste valide. Il ne faudra pas oublier de la détruire plus tard a coup de free.
Alternative (déconseillée) : place "static" devant la déclaration de char ch2[], qui rend le tableau persistant (l'adresse existera donc toujours en sortant), mais attention, si tu rerentres dans la fonction, c'est le meme buffer qui sera utilisé, donc il faut prendre des précautions sur les appels. [...]
Sinon, autre chose :
tu places un moment un "return 0;"
je te conseille vivement de mettre :
"return NULL;"
ça fera la meme chose, mais au niveau lisibilité, c'est beaucoup mieux et ça évite les confusions.
char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
{
long i = 0, j = 0;
char ch2[50]; // Si on change ici 50 par 100 le programme fonctionne
while (ch[i] != c && ch[i] != '\0') // Tant que (c n'est pas trouvée ET non(fin de ch))
i++;
if (ch[i] == c) // Si (lettre trouvée)
{
while (ch[i] != '\0') // On remplit la chaine ch2(de j = 0) par ch(depuis i = la position de la lettre trouvée)
{
ch2[j] = ch[i];
i++;
j++;
}
ch2[j] = '\0';
return ch2;// Sans oublier le symbole de fin de chaîne
}
else // Sinon si (fin de ch atteinte)
return 0; // On retourne NULL
}
Merci pour les réponses mais c'est quoi un malloc ?
Et puis normalement, je ne renvoie pas la variable elle-même à la sortie d'une fonction, mais la valeur de cette dernière quand je mets :
return ch2;
En d'autres termes, c'est comme si j'affecter la valeur de la variable à la sortie de la fonction lors de son appel et non la variable elle même, c'est la valeur à la sortie qui est envoyée. Est-ce que c'est comme ça que ca marche, ou est-ce que je me trompe ?
Merci d'avance.
char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
{
long i = 0, j = 0;
Code en vrac détecté...
Merci de lire les règles du forum avant de poster.
Histoire de ne lire que le premier post du topic et de se répéter pour rien...
Une erreur bizarre
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html