Problème de gestion de chaînes avec pointeur
Bonjour à tous.
Voici mon problème : dans le cadre d'un exercice en rapport avec mon cours, je dois reprogrammer, sans utiliser les indices de tableaux (pas de tab[i] en gros), quelques fonctions déjà existantes (strcat, strcpy, etc).
Voici mon bout de code pour la fonction de concaténation :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void * concatenation(char *s1,char *s2)
{
while(*s1 != '\0') {
s1++;
}
s1--;
while(*s2 != '\0') {
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0';
} |
Que j'appelle comme ça :
Code:
printf("s1 concatene avec s2 donne %s",concatenation(s1,s2));
Alors je vais expliquer le raisonnement que j'ai suivi pour que quelqu'un puisse me dire où ça coince :
1-je parcours la première chaîne jusqu'à tomber sur le caractère de fin de chaîne '\0' ; j'avance mon pointeur de 1 vu que le type char prend un octet
2-ensuite, je recule d'un cran pour ne pas écrire après le '\0' (quoique... effet de bord ou pas, je sais plus)
3-je parcours la deuxième chaîne jusqu'à tomber sur '\0', et à chaque parcours, je mets la valeur *s2 dans la valeur *s1, et j'incrémente de 1 les deux pointeurs pour passer à l'emplacement de lettre suivant
4-pour finir, je rajoute un '\0' pour avoir une chaîne de caractères valide
Ah, initialement je déclarais la fonction en char *, mais je voyais mal ce qu'il fallait que je renvoie avec return.
Enfin voilà, merci d'avance pour votre aide. ^^
Re: Problème de gestion de chaînes avec pointeur
Tu peux même remplacer
Code:
1 2 3 4 5 6
|
while(*s2 != '\0') {
*s1 = *s2;
s1++;
s2++;
} |
par
Code:
1 2 3 4
|
while(*s2) {
*s1++ = *s2++;
} |
C'est plus geek, tu blufferas ton profs comme ça :wink:
Re: Problème de gestion de chaînes avec pointeur
Citation:
Envoyé par tomasha
Tu peux même remplacer
Code:
1 2 3 4 5 6
|
while(*s2 != '\0') {
*s1 = *s2;
s1++;
s2++;
} |
par
Code:
1 2 3 4
|
while(*s2) {
*s1++ = *s2++;
} |
C'est plus geek, tu blufferas ton profs comme ça :wink:
Et tu auras 0 pour manque de lisibilité du code ! (cf un post précédent d'Emmanuel)
Autant faire
Code:
while (*s1++ = *s2++) ;
Re: Problème de gestion de chaînes avec pointeur
Citation:
Envoyé par Trap D
Et tu auras 0 pour manque de lisibilité du code ! (cf un post précédent d'Emmanuel)
Beuuuuh non, il suffit d'ajouter un petit commentaire
Code:
1 2 3 4 5
|
/* copie optimisée de s2 dans s1 */
while (*s2) {
*s1++ = *s2++;
} |
Une code correctement indenté est toujours lisible si il est suffisamment commenté !!!
Re: Problème de gestion de chaînes avec pointeur
Citation:
Envoyé par Trap D
Autant faire
Code:
while (*s1++ = *s2++) ;
Ca marche ça aussi ?
Ouah encore plus geek, génial :lol:
Re: Problème de gestion de chaînes avec pointeur
Citation:
Envoyé par tomasha
Citation:
Envoyé par Trap D
Et tu auras 0 pour manque de lisibilité du code ! (cf un post précédent d'Emmanuel)
Beuuuuh non, il suffit d'ajouter un petit commentaire
Code:
1 2 3 4 5
|
/* copie optimisée de s2 dans s1 */
while (*s2) {
*s1++ = *s2++;
} |
Une code correctement indenté est toujours lisible si il est suffisamment commenté !!!
De toutes façons,
http://www.eoliennes-en-retz.com/ima...nnet-d_ane.jpgpour Trap D et tomasha, car le 0 final n'est jamais copié...
Re: Problème de gestion de chaînes avec pointeur
Citation:
Envoyé par Emmanuel Delahaye
Ouah attends je n'ai posté qu'une partie de code, la partie à remplacer !!
Le reste est toujours valable, notamment le
Re: Problème de gestion de chaînes avec pointeur
http://www.eoliennes-en-retz.com/ima...nnet-d_ane.jpg
pour Emmanuel :lol:
Révise le K & R (page 98 edition 1986.)
Ceci dit, on peut éviter :wink: