Signaler

Fonction majuscule [Résolu]

Posez votre question hcp7kuz 187Messages postés mardi 18 août 2015Date d'inscription 9 juillet 2017 Dernière intervention - Dernière réponse le 6 juil. 2017 à 12:03 par hcp7kuz
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 :

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
Utile
+0
plus moins
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.
[Dal] 4382Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 20 septembre 2017 Dernière intervention - 6 juil. 2017 à 10:40
oui, il doit terminer
result
par le caractère
'\0'
, mais il a aussi un dépassement de tampon mémoire, car il alloue
result = 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 allouer
result = malloc((strlen(chaine) + 1));
(la taille de la chaîne avec un char additionnel pour le caractère de fin).

A noter, qu'en C
sizeof(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 mettre
strlen(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
Répondre
hcp7kuz 187Messages postés mardi 18 août 2015Date d'inscription 9 juillet 2017 Dernière intervention - 6 juil. 2017 à 12:03
Effectivement, j'avais complétement oublié le
\0
.
Merci !
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !