Exercice en programmation C

Fermé
samehmousbah - 15 oct. 2011 à 20:32
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 16 oct. 2011 à 11:19
Bonjour,
J'ai un exercice en programmation C et j'aime b1 d'aide pour le résoudre .
Merci d'avance :)
Voici l'exercice:
*)This C function performs its job most of the time, but has several defects (bugs, error handling, etc.) in specific situations.

Modify the code to make it as robust as possible, in order to make sure it will not crash or cause any problem in the application, even if the arguments provided to the function are incorrect.

/*
double_whitespaces:
Copy the "msg" buffer of size "size" into the "dest" buffer,
while doubling any blank character found in the source buffer.
*/

int double_whitespaces(char *msg, int size, char *dest) {
int ret;
char *ptr;

char *buf;

buf = malloc(size);

ptr = msg;
while (ptr < msg + size) {
if (*ptr == '%') // % char is forbidden
goto error;
if (*ptr == ' ') {
*buf++ = ' ';
*buf++ = ' ';
} else {
*buf++ = *ptr;

}
ptr++;
}
free(buf);
strcpy(dest, buf);
return 0;
error:
return -1;
}



A voir également:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 16/10/2011 à 11:23
Bonjour,
la variable int ret; n'est pas utilisée, l'allocation pour buf ne prend pas en compte la nouvelle taille qu'aura la chaîne de sortie en ajoutant les espaces supplémentaires. Vous pouvez en premier lieu compter le nombre d'espaces et l'ajouter pour l'allocation +1 pour le caractère null de fin de chaîne, il faut ajouter le caractère null à la fin. Il n'y pas de vérification du retour de malloc (NULL en cas d'échec) il faut l'ajouter. Le fait de retourner un int n'a pas vraiment de sens comme le free de buf, le strcpy admet que dest est un tableau de char qui a déjà la taille suffisante pour prendre la chaîne (allouée à l'extérieur donc) pourquoi ne pas simplement retourner l'adresse de buf et la récupérer dans dest ?
Aussi comme dit dans l'énoncé "even if the arguments provided to the function are incorrect." Retirez le paramètre "size" de la fonction il ne sert à rien puisqu'en calculant le nombre d'espace vous obtenez le nombre de char de la chaîne "msg" :
int n,i; for(n=i=0;msg[i];i++)if(msg[i]==' ')n++;

un truc comme ça, i = taille de msg et n = nombre d'espaces
0