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

  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.

  8. #8
    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
    bon désolé, no comprendo

    voilà donc :

    1- comment remplir des chaînes, pour lesquelles on a alloué de l'espace avec malloc(), avec des caractères ?

    2- comment faire alors pour ne pas écraser les pointeurs, faut-il faire encore un pointeur sur le pointeur de début de chaîne et le déplacer avec une boucle ?

    ps : comme c'est dans un but d'apprentissage et de comprendre comment marche la bête, je veux éviter les fonctions toutes faites.

    merci.

  9. #9
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Pour remplir une chaîne, t'as plusieurs possibilités :

    - Utiliser ne fonction de saisie (fgets idéalement, sinon scanf, gets, etc.).
    - strcpy
    - Remplir lors de la déclaration...

  10. #10
    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
    ok,

    donc *(c+i) n'est ps une lvalue alors, c a d qu'on ne peut pas lui affecter qq une fois que l'on a déjà "mis" une chaîne dedans alors car

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *c, *pc;
    pc=c;
    c="bonjour";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *(c+2)='x' ou *(pc+2) ne marchent pas
    donc voilà ma dernière question.

    Je vote pour celui qui m'explique clairement les pointeurs et pour qu'un grand débat national soit organisé sur ce sujet trop souvent ignoré

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gauguin
    bon désolé, no comprendo

    voilà donc :

    1- comment remplir des chaînes, pour lesquelles on a alloué de l'espace avec malloc(), avec des caractères ?
    L'espace qui a été alloué, et dont l'adresse du premier élément a été stockée dans le pointeur, est un tableau de char. Pour y mettre une chaine, on peut utiliser plusieurs solutions.
    • l'accès direct caractère par caractère, dans une boucle, par exemple.
    • strcpy()
    • memcpy()
    • un tas d'autres moyens plus complexes, sprintf(), fgets() etc.

    Ne jamais perdre de vue qu'une chaine est un tableau de char initialisé terminé par un 0. Sinon, le comportement est indéfini.

    2- comment faire alors pour ne pas écraser les pointeurs,
    On s'abstient d'écrire dans le pointeur ou de le modifier...
    faut-il faire encore un pointeur sur le pointeur de début de chaîne et le déplacer avec une boucle ?
    En général, un indice suffit. On a affaire à un tableau dont on ne connait pas nom, mais dont on connait l'adresse du premier élément et le type des éléments. On a donc le droit d'utiliser la notation indicée ([i]) avec le pointeur pour atteindre n'importe quel élément du tableau, du moment qu'on est dans les limites.
    .

+ 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