Fonction majuscule
Résolu
hcp7kuz
Messages postés
238
Date d'inscription
Statut
Membre
Dernière intervention
-
hcp7kuz Messages postés 238 Date d'inscription Statut Membre Dernière intervention -
hcp7kuz Messages postés 238 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai écris une fonction qui retourne une chaine mise en majuscule.
Problème, le fonction retourne effectivement la chaine en majuscule, mais avec également quelques caractères en plus, et je ne vois pas pourquoi.
Quelqu'un a un idée ?
Code :
Merci,
hcp7kuz
J'ai écris une fonction qui retourne une chaine mise en majuscule.
Problème, le fonction retourne effectivement la chaine en majuscule, mais avec également quelques caractères en plus, et je ne vois pas pourquoi.
Quelqu'un a un idée ?
Code :
char* strToUpper(char* chaine) {
char *result = NULL;
result = malloc((strlen(chaine) - 1) * sizeof(char));
int i;
for (i = 0; i < strlen(chaine); i++) {
result[i] = toupper(chaine[i]);
}
return result;
}
Merci,
hcp7kuz
1 réponse
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour, la chaîne de départ se termine par un caractère NULL, indiquant la fin de la chaîne.
strlen() te donne la longueur de la chaîne, sans ce caractère NULL.
donc, ta fonction retourne une chaîne non terminée par un caractère NULL, ce qui explique ce que tu observes.-
oui, il doit terminer
result
par le caractère'\0'
, mais il a aussi un dépassement de tampon mémoire, car il alloueresult = malloc((strlen(chaine) - 1) * sizeof(char));
(soit une taille inférieure d'un char à la longueur de la chaîne sans compter le caractère de fin ... donc trop petite de 2 char), alors qu'il devrait allouerresult = malloc((strlen(chaine) + 1));
(la taille de la chaîne avec un char additionnel pour le caractère de fin).
A noter, qu'en Csizeof(char)
est garantit de valoir 1, il est donc inutile.
char * strToUpper(char * chaine) { char * result = NULL; int i; result = malloc((strlen(chaine) + 1)); for (i = 0; i < strlen(chaine); i++) { result[i] = toupper(chaine[i]); } result[i] = '\0'; return result; }
On peut optimiser le code, aussi, en évitant de mettrestrlen(chaine)
dans la boucle for et en ne l'exécutant qu'une fois au début de la fonction.
Enfin, cela serait bien de tester que malloc a bien alloué la mémoire nécessaire et de décider de ce fait la fonction si ce n'est pas le cas.
Dal -
-