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 :

[Fonction]strcpy [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Par défaut [Fonction]strcpy
    Est-il possible d'utiliser cette fonction avec un tableau de destination non déterminé?
    Si oui, comment?
    Sinon, quelle est la meilleure solution? Utiliser une boucle?

  2. #2
    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 Re: [Débutant(e)][Fonction]strcpy
    Citation Envoyé par Lucky-94
    Est-il possible d'utiliser cette fonction avec un tableau de destination non déterminé?
    Si oui, comment?
    Sinon, quelle est la meilleure solution? Utiliser une boucle?
    J'ai rien compris. Montre ce que tu veux faire.

  3. #3
    Membre confirmé Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Par défaut
    Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /* Exemple */
     
    # include <stdio.h>
     
    int main (void)
    {
        char str1[] = "Exemple", str2[];
        printf("Avant copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        strcpy (str2, str1);
        printf("Apres copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        return 0;
    }
    Compilation: array size missing in 'str2'

    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /* Exemple2 */
     
    # include <stdio.h>
     
    int main (void)
    {
        char str1[] = "Exemple", str2[] = "";
        printf("Avant copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        strcpy (str2, str1);
        printf("Apres copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        return 0;
    }
    Sortie:
    Avant copie de str1 dans str2:
    str1 contient: Exemple
    str2 contient:
    Apres copie de str1 dans str2:
    str1 contient: xemple
    str2 contient: Exemple

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Je pense que c'est ceci que tu désires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char tableau[101] = {0};
     
    strncpy (tableau, "coucou", sizeof (tableau) - 1);
    Tu peux simplifier en cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define CopyString(dst,src) strncpy (dst, src, sizeof (dst) - 1)
    Mais ATTENTION, cela ne sera fonctionnel qu'avec des tableaux définit comme dans l'exemple.

    J'espère avoir répondu à ta question.[/img]

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # include <stdio.h>
     
    int main (void)
    {
        char str1[] = "Exemple", str2[] = "";
        printf("Avant copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        strcpy (str2, str1);
        printf("Apres copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        return 0;
    }
    Ça doit planter car tu recopies str1 dans str2 qui
    est trop courte, c'est une chaîne initialisée avec une chaîne de longueur 0, donc le compilo a réservé un seul octet pour elle.
    est non modifiable, car les chaînes définies en dur se trouvent en principe dnas une zone non modifiable de la mémoire. Ça semble fonctionner peut-être mais le moins que l'on puisse dire est qu'il est faux et non portable.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut
    D'ailleur si tu prends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    # include <stdio.h>
     
    int main (void)
    {
        char  str1[] = "Exemple", str2[] = "",
                str3[]  = "vive le jardinage";/***/
        printf("Avant copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        strcpy (str2, str1);
        printf("Apres copie de str1 dans str2:\n");
        printf("str1 contient: %s\n", str1);
        printf("str2 contient: %s\n", str2);
        printf("str3 contient: %s\n", str3);/***/
        return 0;
    }
    Tu risque d'etre surpris quand à la valeur de str3, dans le meilleur des cas ça va passer puis en release tu auras une erreur de segmentation.

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par Lucky-94
    Compilation: array size missing in 'str2'
    Comment il fait le compilateur pour connaitre la taille de str2 ? au hasard ?

    Citation Envoyé par Lucky-94
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char str1[] = "Exemple", str2[] = "";
    Dans ce cas, au moins le compilateur connait la taille à allouer pour str2 mais attention à la concordance des tailles lors de l'utilisation de strcpy!

    Citation Envoyé par ronan99999
    dans le meilleur des cas ça va passer puis en release tu auras une erreur de segmentation.
    cela s'appel un comportement indéfinie, tout est possible.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par Lucky-94
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char str1[] = "Exemple", str2[] = "";
    Dans ce cas, au moins le compilateur connait la taille à allouer pour str2 mais attention à la concordance des tailles lors de l'utilisation de strcpy!
    Dans le cas d'une initialisation en dur, la zone est non modifiable, donc le strcpy plante.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Trap D
    Dans le cas d'une initialisation en dur, la zone est non modifiable, donc le strcpy plante.
    Je ne crois pas (je peut me tromper, bien sûr) :
    la chaîne est recopiée dans s, qui au passage est un tableau de 8 char.
    Par contre avec :
    Dans ce cas, l'adresse de la chaîne peut pointer sur une zone non modifiable de la manière.

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    il se pourrait (et quand je dis il se pourrait ...) bien que tu aies raison, je viens de tester, ça ne plante pas, j'ai confondus avec le char *
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  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 Lucky-94
    Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Exemple */
     
    # include <stdio.h>
     
    int main (void)
    {
        char str1[] = "Exemple", str2[];
    Comme l'indique ton compilateur, il n'est pas possible de définir un tableau sans taille(ni de taille 0). Ce code n'a donc aucun sens. Si tu veux un tableau dynamique, tu l'alloues avec malloc() et tu stockes son adresse dans un pointeur du bon type.
    Compilation: array size missing in 'str2'

    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Exemple2 */
     
    # include <stdio.h>
     
    int main (void)
    {
        char str1[] = "Exemple", str2[] = "";
    Ce code est techniquement correct, mais le tableau défini a une taille de 1 char (ici, 0), soit une longueur de chaine utile de 0, ce qui n'est pas grand chose...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        strcpy (str2, str1);
    }
    Vu la taille de str2, le comportement est indéfini.

  12. #12
    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 Trap D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        char str1[] = "Exemple", str2[] = "";
    }
    Ça doit planter car tu recopies str1 dans str2 qui
    est non modifiable, car les chaînes définies en dur se trouvent en principe dnas une zone non modifiable de la mémoire.
    Non un tableau de char est modifiable. Le problème, c'est la taille. (1, soit une charge utile de 0!)

  13. #13
    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 Trap D
    il se pourrait (et quand je dis il se pourrait ...) bien que tu aies raison, je viens de tester, ça ne plante pas, j'ai confondus avec le char *
    C'est même certain, aucun doute là-dessus.

  14. #14
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Trap D
    Code:

    char str1[] = "Exemple", str2[] = "";
    }
    Ça doit planter car tu recopies str1 dans str2 qui
    Arrow est non modifiable, car les chaînes définies en dur se trouvent en principe dnas une zone non modifiable de la mémoire.
    Non un tableau de char est modifiable. Le problème, c'est la taille. (1, soit une charge utile de 0!)
    Je ne comprends pas trop ce que tu entends par "un tableau de char est modifiable" ?

  15. #15
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Tu peux modifier les données du tableau. Le problème est de ne pas aller modifier des trucs qui ne seraient pas dans le tableau.

  16. #16
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    D'accord à ce niveau là, mais le fait de dire qu'un tableau de char est modifiable m'a fait penser qu'il pouvait modifier la taille du tableau ce qui porte à confusion.

    C'est pour cela que je voulais une explication afin de comprendre ce qu'il voulait dire.

  17. #17
    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 swirtel
    Je ne comprends pas trop ce que tu entends par "un tableau de char est modifiable" ?
    est un tableau de char. Il est modifiable. Je peux écrire dedans.
    est un tableau de char initialisé. Il est modifiable. Je peux écrire dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const s[] = "hello";
    est un tableau de char initialisé. Il est non modifiable. Je ne peux pas écrire dedans.
    est un pointeur sur une chaine. Cette chaine n'est pas modifiable. Pour le signifier au compilateur, il est préférable de le préciser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const *s = "hello";

  18. #18
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Emmanuel, merci de l'explication, mais je précisais dans mon commentaire que je n'avais pas très bien compris le sens de "tableau modifiable".

    Simple problème de compréhension.

  19. #19
    Membre confirmé Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Par défaut
    Bonjour,
    Je sais que ce fil commence à dater, mais j'y reviens tout de même.
    J'ai bien lu vos réponses et essayé de comprendre.
    Ce que je n'arrive pas à expliquer (ou comprendre) c'est pourquoi, par rapport à ce nouvel exemple (3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /* Exemple3 */ 
     
    # include <stdio.h> 
     
    int main (void) 
    { 
        char str1[] = "Exemple", str2[7]=""; 
        printf("Avant copie de str1 dans str2:\n"); 
        printf("str1 contient: %s\n", str1); 
        printf("str2 contient: %s\n", str2); 
        strcpy (str2, str1); 
        printf("Apres copie de str1 dans str2:\n"); 
        printf("str1 contient: %s\n", str1); 
        printf("str2 contient: %s\n", str2); 
        return 0; 
    }
    pourquoi, donc, dans l'exemple 2 l'utilisation de «*strcpy*» modifie mon tableau «*str1*» en lui ajoutant le caractère nul (\0)?
    Ou plutôt, ce caractère nul devant être ajouté automatiquement à l'initialisation, pourquoi «*strcpy*» décale mon tableau «*str1*» d'un octet?
    Sûrement une particularité de «*strcpy*» que je ne connais pas...
    Merci.

  20. #20
    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 Lucky-94
    J'ai bien lu vos réponses et essayé de comprendre.
    Ce que je n'arrive pas à expliquer (ou comprendre) c'est pourquoi, par rapport à ce nouvel exemple (3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Exemple3 */ 
     
    # include <stdio.h> 
     
    int main (void) 
    { 
        char str1[] = "Exemple", str2[7]="";
    Attention. La taille de str2 est de 7 char, soit 6 + 1 (le 0 final). La chaine "Exemple" fait 7 + 1, soit 8 char.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        printf("Avant copie de str1 dans str2:\n"); 
        printf("str1 contient: %s\n", str1); 
        printf("str2 contient: %s\n", str2);
    Ok.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        strcpy (str2, str1);
    Comportement indéterminé. La source est plus grande que la destination.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        printf("Apres copie de str1 dans str2:\n"); 
        printf("str1 contient: %s\n", str1); 
        printf("str2 contient: %s\n", str2); 
        return 0; 
    }
    A cause du comportement indéterminé, le reste n'a plus aucun sens. Il faut commencer par corriger le code.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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. ecriture fonction strcpy
    Par gauguin dans le forum C
    Réponses: 10
    Dernier message: 19/02/2007, 22h38
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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