IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

ecriture fonction strcpy


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Par défaut ecriture fonction strcpy
    Salut,

    J'essaie d'ecrire un petit bout de code qui copie une chaîne de caractères dans une autre. Ce ne sont pas des tableaux mais des pointeurs.
    C'est une sorte de fonction strcpy.

    Cependant ça ne fonctionne pas et le programme se ferme.
    But why ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char *c, *c1;
      c=malloc(49+1);  
      c1=malloc(49+1);   
      c="bonjour";
      c1="au revoir";
      int i=0;
      for(i=0; i<50; i++)  *(c+i)=*(c1+i);
    ET pareil avec
    merci.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      c=malloc(49+1);  
      c1=malloc(49+1);
    La tu alloues la memoire pour contenir tes chaines, jusque la ca va.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      c="bonjour";
      c1="au revoir";
    Boum, tu ecrase les adresses fournies par malloc par celle de chaines constantes.
    Tu as donc une belle fuite de memoire. La copie de chaine ne se fait pas avec = mais avec strcpy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      int i=0;
      for(i=0; i<50; i++)  *(c+i)=*(c1+i);
    c et c1 contenant l'adresse de chaines constantes, la modification de c est un comportement indefini.

    . En outre, tu ne verifies pas si l'allocation a correctement fonctionnee (c != NULL et c1 != NULL)
    . tu ne liberes pas la memoire allouee (meme si ici c'est impossible puisque tu n'as plus de pointeur sur la zone allouee)
    . De plus, pourquoi utilises tu une allocation dynamique pour des tableaux de taille fixe ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Par défaut
    Pour répondre à la question, je me mélange un peu les pinceaux à vrai dire.

    L'allocation dynamique je l'utilise juste parce que j'ai appris ça recemment

    sinon, le fait de rentrer une chaine ( c="bonjour"; ) à partir d'un pointeur auquel on a alloué de la mémoire écrase les adresses fournies par malloc() ?

    comment faire alors pour remplir une chaîne après avoir alloué de la mémoire ?

  4. #4
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par gauguin
    Pour répondre à la question, je me mélange un peu les pinceaux à vrai dire.

    L'allocation dynamique je l'utilise juste parce que j'ai appris ça recemment

    sinon, le fait de rentrer une chaine ( c="bonjour"; ) à partir d'un pointeur auquel on a alloué de la mémoire écrase les adresses fournies par malloc() ?

    comment faire alors pour remplir une chaîne après avoir alloué de la mémoire ?
    La réponse t'a été donnée plus haut. Il faut utliser strcpy().
    Mais vu le titre de ton post, ce n'est donc pas la réponse que tu attends.
    Tu peux éventuellement utiliser la fonction memcpy ou bien copier caractère par caractère dans une boucle.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Par défaut
    voilà, précisément, je veux copier caractères par caractères.

    Et je ne comprends pas pourquoi ma boucle dans le 1er message ne marche pas.
    (même si j'enlève le malloc()).

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par gauguin
    voilà, précisément, je veux copier caractères par caractères.

    Et je ne comprends pas pourquoi ma boucle dans le 1er message ne marche pas.
    (même si j'enlève le malloc()).
    Car c contient l'adresse d'une chaine constante qui peut ne pas etre modifiable et de surcroit pas assez longue.

    Tant que les chaines initiales ne sont pas correctes, le reste ne fonctionnera pas.
    Si tu souhaites avoir deux chaines valide contenant "bonjour" et "au revoir" pouvant faire 49 caracteres de long (hors \0 final), tu peux les creer avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char c[49+1] = "bonjour";
    char c1[49+1] = "au revoir";

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par gauguin
    voilà, précisément, je veux copier caractères par caractères.

    Et je ne comprends pas pourquoi ma boucle dans le 1er message ne marche pas.
    (même si j'enlève le malloc()).
    La copie dans la boucle se passait mal parceque tu avais écrasé tes pointeurs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. sur la fonction strcpy
    Par chettane dans le forum Débuter
    Réponses: 7
    Dernier message: 22/09/2011, 16h52
  2. fonction strcpy important
    Par aurélienutc dans le forum C
    Réponses: 3
    Dernier message: 17/04/2008, 20h30
  3. [Fonction]strcpy
    Par Lucky-94 dans le forum C
    Réponses: 23
    Dernier message: 04/03/2006, 15h33
  4. fonction ecriture dans une table
    Par smbpopov33 dans le forum Access
    Réponses: 5
    Dernier message: 20/06/2005, 14h52
  5. ecriture de fonction
    Par madison59 dans le forum C++Builder
    Réponses: 6
    Dernier message: 31/01/2004, 23h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo