Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C > Exercie réécriture des fonctions chaines > Lecture du sujet

Exercie réécriture des fonctions chaines

petits, mais tout petit problème

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne RAPAS # Posté le 18/07/2008 à 17:25:02
Groupe : Membres
Salut !

Dans l'exercice de réécriture de la fonction qui permet de copier une chaine, j'ai un tout petit soucis, et je ne voit pas d'où cela provient.

Mon code :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>

void copierLaChaine(char chaineOriginal[], char chaineCopie[]);

int main()
{
	char chaineOriginal[] = "Salut";
	char chaineCopie[] = "";

	printf("Chaine original : %s \n\n", chaineOriginal);

    copierLaChaine(chaineOriginal, chaineCopie);

    printf("Chaine copier : %s \n\n", chaineCopie);
	return 0;
}

void copierLaChaine(char chaineOriginal[], char chaineCopie[])
{
    int i = 0;

    for (i = 0; i <= '\0'; i++)
    {
        chaineCopie[i] = chaineOriginal[i];
    }

}


Résultat :

Code : Console
Chaine original : Salut

Chaine Copier : SSalut


Tout bêtement ma question est, pourquoi y-a-t-il marqué SSalut et non Salut ?

Blagounet

// Des blagues à gogo !
 
Hors ligne moi281184 # Posté le 18/07/2008 à 17:36:09
Groupe : Membres
Tu déclares ton tableau chaineCopie[] comme étant un tableau de 1 caractère (le caractère \0), puis tu veux mettre 6 caractères dedans... déjà là ça ne peut pas marcher.

Passe plutôt par un char* et fait un malloc dans ta fonction.

En plus tu fais :
for (i = 0; i <= '\0'; i++)

Ta condition i <= '\0' est une erreur totale, c'est chaineOriginal[i]!='\0' qu'il faut tester.

Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne RAPAS # Posté le 18/07/2008 à 17:39:10
Groupe : Membres
Merci mais qu'est-ce qu'un malloc?

Blagounet

// Des blagues à gogo !
 
Hors ligne Lord of Mushrooms # Posté le 18/07/2008 à 19:26:07
On se saigne aux 4 fromages !
Avatar
Groupe : Membres
M@teo21 t'explitque tout dans son tuto ;)

Certains déchets nucléaires produits dans les années 60 resteront radioactifs pendant des millions d'années. Pour ceux produits maintenant, il faudra juste 40 ans de plus...
(paradoxalement je suis pour le nucléaire, allez comprendre...)
 
Hors ligne Pingouin chauffé # Posté le 18/07/2008 à 19:29:13
Platypus Addict
Avatar
Groupe : Membres
Non mais son but c'est de s'entraîner avec les pointeurs et les chaînes de caractères, suite au chapitre de M@teo21 sur le même sujet. C'est incroyable comme les gens ne savent pas s'adapter à leur auditoire >_< .

Herr Mannelig, herr Mannelig trolofven i mig
För det jag bjuder så gerna
I kunnen väl svara endast ja eller nej
Om i viljen, eller ej.
 
Hors ligne Lord of Mushrooms # Posté le 18/07/2008 à 19:59:14
On se saigne aux 4 fromages !
Avatar
Groupe : Membres
Citation : pingouin chauffé
C'est incroyable comme les gens ne savent pas s'adapter à leur auditoire >_<

C'est pas faux... On n'a pas pensé qu'il pouvait ne pas avoir encore vu l'allocation dynamique (je n'ai pas la structure du cours de m@téo21 en tête ^^ ) et franchement, un malloc dans un cas comme celui-ci je n'ai pas trouvé ça choquant.

@RAPAS : Désolé de ne pas y avoir pensé. Sans malloc, une solution consiste à déclarer chaineCopie avec une longueur suffisante pour pouvoir contenir n'importe quelle chaîne que l'on pourrait avoir à copier (ex : chaîneCopie[50] pour des chaînes de 40 caractères). C'est là qu'on voit l'avantage du malloc (tu verras ça dans quelques chapitres), il te permet entre autres de créer des tableaux dont la taille n'est connue qu'à l'exécution, tu pourra ainsi systématiquement donner à chaineCopie la bonne taille, et donc copier des chaines sans limite de longueur.

Certains déchets nucléaires produits dans les années 60 resteront radioactifs pendant des millions d'années. Pour ceux produits maintenant, il faudra juste 40 ans de plus...
(paradoxalement je suis pour le nucléaire, allez comprendre...)
 
Hors ligne RAPAS # Posté le 19/07/2008 à 01:21:40
Groupe : Membres
Ok merci pour l'explication du malloc.
Mais mon problème n'est toujours pas résolu, je me demande toujours pourquoi le résultat est SSalut et non Salut.

Blagounet

// Des blagues à gogo !
 
Hors ligne Lord of Mushrooms # Posté le 19/07/2008 à 02:15:53
On se saigne aux 4 fromages !
Avatar
Groupe : Membres
:p Mais si ton problème a été résolu :

Citation : moi281184
Ta condition i <= '\0' est une erreur totale, c'est chaineOriginal[i]!='\0' qu'il faut tester.

Enfin là on corrige un problème de programmation, mais on créé un problème d'algorithme :-° : on s'arrête de copier lorsqu'on rencontre \0, le souci c'est qu'on n'a pas dit à chaineCopie qu'il fallait s'arrêter là, donc selon ta mémoire tu risque d'obtenir des trucs bizarres genre "Salut!#$dsfjhsdgh", il faut rajouter chaineCopie[i]='\0' après la boucle for pour dire à chaineCopie qu'elle se finit là et ainsi corriger le problème.

Par contre je te conseille de remplacer char chaineCopie[]="" par char chaineCopie[100] pour éviter un dépassement de mémoire ;) (bien sûr tu peux mettre plus de 100, le but étant ici que chaineCopie soit au moins aussi longue que chaineOriginal).

Certains déchets nucléaires produits dans les années 60 resteront radioactifs pendant des millions d'années. Pour ceux produits maintenant, il faudra juste 40 ans de plus...
(paradoxalement je suis pour le nucléaire, allez comprendre...)
 

Retour au forum "Langage C" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 507 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.036s (0.0131s)