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 :

Attribuer la valeur d'une pointeur à une variable tableau de char


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Points : 9
    Points
    9
    Par défaut Attribuer la valeur d'une pointeur à une variable tableau de char
    Bonjour,

    Comment est-ce que je peux enregistrer la valeur contenue dans le pointeur *ptr dans la variable tableau mot2 ici ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main(){
        char mot1[15]={"test"};
        char mot2[15];
        char *ptr;
        ptr = mot1;
    }
    Merci pour votre aide.

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Il faut utiliser une fonction de copie comme strcpy ou strncpy(celle la est mieux, pas de risque de dépasser la taille du tampon de destination).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string.h>
     
    void main(){
        char mot1[15]={"test\0"};
        char mot2[15]={0};
        char *ptr;
        ptr = mot1;
     
       strncpy(&mot2, ptr, strlen(ptr));
    }
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    • Le retour de la fonction main() est de type int et non void.
    • char mot1[15]={"test\0"}; aucun besoin d'accolades ou de \0 explicite à la fin :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      char mot1[15] = "test";
      // équivalent à 
      char mot1[15] = {'t', 'e', 's', 't', '\0'};
      Rajouter un \0 comme tu le fais reviendrait à avoir {'t', 'e', 's', 't', '\0', '\0'}.
    • strncpy(&mot2, ptr, strlen(ptr)); : mot2 dans & devant. Et son utilisation ici avec strlen() est strictement équivalente à utiliser strcpy() et ne constitue en rien une sécurité évitant de dépasser la taille du tampon de destination. Imaginons que ptr pointe sur une chaine de longueur supérieure à 15 caractères (ce n'est évidemment pas le cas ici), alors strlen(ptr) renverrai cette même longueur > 15.
      C'est la taille du tampon de destination qu'il faut mettre, cette de char mot2[15], soit 15 ici, et ne pas oublier de rajouter le '\0' en dernière position dans le cas où la chaine source dépasse cette capacité et que ce dernier n'est alors pas ajouté par la fonction.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Points : 9
    Points
    9
    Par défaut
    Avec visual studio je n'ai pas le choix, je dois mettre void et non int dans la fonction main et je ne retourne rien.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Et pourtant, c'est la norme (au sens du traité ratifié)

    Soit tu utilises un très vieux Visual, soit tu compiles dans un mode étrange, soit tu fais une erreur.
    Quel message exactement as-tu quand tu définis main comme
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Futur Membre du Club
    Homme Profil pro
    rêveur
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : rêveur

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par wallace27 Voir le message
    Comment est-ce que je peux enregistrer la valeur contenue dans le pointeur *ptr dans la variable tableau mot2 ici ?
    Le vocabulaire utilisé n’est pas tout à fait correcte :

    • *ptr n’est pas un pointeur, en revanche ptr oui
    • La seule valeur que contient un pointeur, c’est une adresse
    • On peut parler de la valeur pointé, et en l’occurrence c’est 't'
    • la variable tableau mot2 n’est pas modifiable
    • On peut toutefois modifier le contenu du tableau



    La bonne formulation serait plutôt : « Comment copier la chaine pointé par ptr dans le tableau mot2 ? ». Et la réponse est naturellement strcpy().

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wallace27 Voir le message
    Bonjour,

    Comment est-ce que je peux enregistrer la valeur contenue dans le pointeur *ptr dans la variable tableau mot2 ici ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main(){
        char mot1[15]={"test"};
        char mot2[15];
        char *ptr;
        ptr = mot1;
    }
    Bonjour

    "ptr" contient exactement la même chose que "mot1" donc tu peux t'en servir exactement de la même façon => strcpy(mot2, mot1) ou bien strcpy(mot2, ptr)
    Citation Envoyé par InitSreen Voir le message
    Il faut utiliser une fonction de copie comme strcpy ou strncpy(celle la est mieux, pas de risque de dépasser la taille du tampon de destination).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string.h>
     
    void main(){
        char mot1[15]={"test\0"};
        char mot2[15]={0};
        char *ptr;
        ptr = mot1;
     
       strncpy(&mot2, ptr, strlen(ptr));
    }
    Rarement vu un code aussi horrible chez un intervenant. Sur ces 6 lignes il y a 3 erreurs !!!
    1. main est de type int
    2. on ne mixe pas l'écriture "tableau" et l'écriture "chaine" => soit on écrit {...}, soit on écrit "..." (ou alors c'est qu'on veut stocker un tableau de chaines)
    3. pas de "&" devant un nom de tableau car c'est déjà une adresse


    Sinon tu veux bien m'expliquer comment strlen(chaine_d'origine) empêchera de dépasser la taille du tampon de destination ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Je débute en C et comme j'ai lut vite fait, ça donne une très mauvaise réponse. il est vrai qu'il aurait fallut un truc du genre:

    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
    #include<stdlib.h>
    #include<string.h>
     
    int main ()
    {
      char mot1[15]="test";
      char *mot2;
      int i;
     
      if ( (mot2 = calloc( (strlen(mot1) + 1), sizeof (char) ) ) == NULL)
        exit(1);
      for (i = 0; i < (strlen(mot1) + 1); i++)
        mot2[i] = 0;
     
      strncpy(mot2, mot1, strlen(mot1));
    }
    désolé!!!
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par InitSreen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(mot2, mot1, strlen(mot1));
    Identique à strcpy(mot2, mot1) puisque strlen() comme strcpy() s'arrêtent tous deux au premier '\0' trouvé dans "mot1". Identique mais moins rapide puisqu'il y a un appel inutile à une fonction de plus...

    Citation Envoyé par InitSreen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mot2 = calloc( (strlen(mot1) + 1), sizeof (char) )
    Pareil. Inutile d'appeler calloc() puisque strcpy() rajoutera le '\0' qu'il faut. Donc pourquoi tout mettre à 0 puisque le seul 0 réellement nécessaire sera bien écrit au bon moment ? Un simple malloc() suffit.
    Ceci dit, si tu utilises strncpy() alors calloc() se justifie puisque strncpy() ne met pas forcément le 0 final.

    Accessoirement, tu as reproduit le code de strdup()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    je ne connaissais pas strdup() et, effectivement, ça fait beaucoup de code pour pas grand chose. Je me coucherais moins bête ce soir.
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attention, strdup() ne fait pas partie du standard C, c'est une fonction POSIX.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    J'ai vu, c'est pour ça que je la connaissais pas. Je travaille avec le standard ISO/EIC 9899:201x comme référence. Faut que je trouve le standard POSIX en pdf.
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2021, 17h57
  2. [PHP 5.1] Comment attribuer plusieurs valeurs à un même nom de variable
    Par franckhelin dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2015, 15h07
  3. Stocker une string dans un tableau de char à deux dimensions
    Par faitor1 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/03/2014, 03h12
  4. [RegExp] Détecter des combinaisons dans une chaine une par une
    Par vermine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/06/2010, 14h22
  5. Entrer une grille dans un tableau de char
    Par killersky4 dans le forum Débuter
    Réponses: 3
    Dernier message: 05/01/2009, 17h41

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