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 :

Probleme strncpy dans un tableau


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut Probleme strncpy dans un tableau
    Bonjour,

    J'ai besoin d'aide concernant la fonction strncpy.

    J'ai un tableau de 100 caractere, et j'aimerais mettre les caractéres de la case 64 à 95 dans un tableau. Pour cela je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char tabEnTete[44];
    strcpy (tabEnTete, "192.168.1.18 8080 192.168.1.24 8080");
    Ensuite plus bas je veux mettre la deuxieme IP dans un tableau donc je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char IP[16]
     
    strncpy (IP, tabEnTete[23], 39);
    Mais cela ne fonctionne pas, quelqu'un as une idée du probléme ?

    D'avance Merci !!!!

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 175
    Par défaut
    ça ne peut pas marcher, strncpy attend un pointeur sur une chaine (une chaine en C est un tableau de char terminé par \0) en destination, un en source, le nombre de caractères max à copier. Toi tu passes un char (tabEnTete[23])

    Si tu veux ajouter du texte à la fin tu peux utiliser strcat/strncat.

    Pour copier une chaine à l'emplacement 23 de ta chaine
    tu peux procéder comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *temp=&tabEnTete;
    temp=temp+23;
    strncpy(temp,chaine_a_copier,nbre_a_copier);
    Il y a mieux, mais cela va te permettre de comprendre.

    va créer un tableau de 44 char. Si tu t'en sert pour gérer une chaine de caractère, tu auras 43 caractères disponible, tu dois en garder 1 pour le \0 final. Les fonctions travaillant sur des chaines comme strcpy, strcat ajoute automatiquement \0 à la fin de celle-ci, ce \0 permet de détecter la fin de la chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* tabEnTete=malloc(44);
    correspond à la même chose.

    je déclare un pointeur char et je lui affecte l'adresse de tabEnTete (avec &) A ce stade je peux appeler le contenu de tabEnTete par tabEnTete ou par temp.
    j'ajoute 23 à temp temp pointe maintenant sur l'adresse de tabEnTete +23, ceci passé à strcpy va donner l'adresse de destination.

    Il te faut t'assurer que toute modification de tabEnTete ne dépasse pas tabEnTete+44.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char IP[16]
     
    strncpy (IP, tabEnTete[23], 39);
    Gros bug, tu permet à strncpy de copier jusqu'à 39 caractères dans IP, qui ne peut contenir que 16 caractères. Ta fonction marchera que si tu as un \0 dans les 15 premiers caractères copiés, sinon elle va écraser les cases mémoires derrière IP et donc ton code va crasher.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut Reponse chrtophe
    D'accord, mais enfaite ce que je veux c'est recuperer juste l'IP "192.168.1.24" et le mettre dans le tableau IP, c'est pour cela que je procéde comme ça ..

  4. #4
    Membre actif Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Par défaut
    tu veut enregistrer les caractères un à un dans le tableau ou tu veut les afficher comme une chaîne de caractère ??

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    Citation Envoyé par Abacar94 Voir le message
    tu veut enregistrer les caractères un à un dans le tableau ou tu veut les afficher comme une chaîne de caractère ??
    Je voudrais les afficher comme une chaine de caractere.

    Enfaite pour bien re preciser les choses, j'ai un tableau de char qui contient deux ip et deux port, ecrit sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char tabEnTete[44];
    strcpy (tabEnTete, "192.168.1.18 8080 192.168.1.24 8080");
    Je souhaite enfaite copier la deuxieme adresse IP qu'il y a dans le tabEnTete et la mettre dans un autre tableau.
    Pour cela, je pensais que strncpy pouvait le faire, du coup j'indiquai a strncpy la position de début de la chaine de caractére que je voulais copié et le nombre que je voulais copié, je l'ai codé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char IP[17]
     
    strncpy (IP, tabEnTete[23], 16);
    ( J'ai fait une petite modif, il fallait mettre le nombre de caractére a copié et non la position du dernier caractére donc ça explique la différence avec mon permier poste ou j'avais mis 39 a la place de 16 )

    Donc tabEnTete[23] correspond au debut de la deuxieme ip (1er caractére), 16 correspond au nombre de caractére que je veux copié donc les 16 suivants.

    Mais cela ne fontionne pas ..

    Quelqu'un a une idée ? Ou me proposer une autre façon de faire, je suis preneur ..

    Merci !

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 175
    Par défaut
    ( J'ai fait une petite modif, il fallait mettre le nombre de caractére a copié et non la position du dernier caractére donc ça explique la différence avec mon permier poste ou j'avais mis 39 a la place de 16 )
    c'est ce que je te disais.

    Ensuite regardes les fonctions de la famille strstr. strstr te retourne un pointeur sur la première occurrence d'une chaine dans une autre, tu recherches "8080 " et tu auras le pointeur vers ta seconde ip (en ajout les 5 caractères de "8080 "). Reste ensuite à "éliminier" le port de la seconde adresse. Regardes les fonctions strbrk, strsep, et autres.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Membre actif Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Par défaut
    Citation Envoyé par Roate Voir le message
    Je voudrais les afficher comme une chaine de caractere.

    Enfaite pour bien re preciser les choses, j'ai un tableau de char qui contient deux ip et deux port, ecrit sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char tabEnTete[44];
    strcpy (tabEnTete, "192.168.1.18 8080 192.168.1.24 8080");
    Je souhaite enfaite copier la deuxieme adresse IP qu'il y a dans le tabEnTete et la mettre dans un autre tableau.
    Pour cela, je pensais que strncpy pouvait le faire, du coup j'indiquai a strncpy la position de début de la chaine de caractére que je voulais copié et le nombre que je voulais copié, je l'ai codé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char IP[17]
     
    strncpy (IP, tabEnTete[23], 16);
    ( J'ai fait une petite modif, il fallait mettre le nombre de caractére a copié et non la position du dernier caractére donc ça explique la différence avec mon permier poste ou j'avais mis 39 a la place de 16 )

    Donc tabEnTete[23] correspond au debut de la deuxieme ip (1er caractére), 16 correspond au nombre de caractére que je veux copié donc les 16 suivants.

    Mais cela ne fontionne pas ..

    Quelqu'un a une idée ? Ou me proposer une autre façon de faire, je suis preneur ..

    Merci !
    je me suis casser la tête pour avoir une solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include <string.h>
    main()
    {int J;
     char tabEnTete[44];
      strcpy (tabEnTete, "192.168.1.18 8080 192.168.1.24 8080");
     char IP[17];
     for(J=0;J<=12;J++)
        IP[J]=tabEnTete[J+18];  
      printf("\n%s",IP);
    }
    si ta des question il faut les poser et aussi il faut mettre histoire de m'encourager

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy (IP, tabEnTete[23], 16);
    tabEnTete[23] n'est pas un pointeur, mais un char.
    Ce que tu cherches à faire, c'est &tabEnTete[23] (alias tabEnTete+23).

    PS: Et fais attention, pour des raisons historiques, la fonction strncpy() n'insère pas de caractère nul terminal lorsqu'elle tronque la chaîne.
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/11/2009, 15h06
  2. [MySQL] probleme affichage dans un tableau avec double requetes
    Par roy-mustang dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/05/2009, 09h25
  3. probleme iframe (dans un tableau) sous firefox
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 06/05/2008, 12h04
  4. [Tableaux] probleme unserialize dans un tableau(list)
    Par urikawa dans le forum Langage
    Réponses: 2
    Dernier message: 19/06/2006, 11h29
  5. Réponses: 16
    Dernier message: 02/12/2005, 10h39

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