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 :

copier une chaine contenant plusieurs \0


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut copier une chaine contenant plusieurs \0
    Bonjour,

    Je m'excuse si ce n'est pas tout à fait la bonne section, mais j'ai un problème relatif au C et je ne suis pas un expert...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LONG SCardListReaders(
      __in     SCARDCONTEXT hContext,
      __in     LPCTSTR mszGroups,
      __out    LPTSTR mszReaders,
      __inout  LPDWORD pcchReaders
    );
    Avec notamment la paramètre mszReaders
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mszReaders
     
        Multi-string that lists the card readers within the supplied reader groups. If this value is NULL, SCardListReaders ignores the buffer length supplied in pcchReaders, writes the length of the buffer that would have been returned if this parameter had not been NULL to pcchReaders, and returns a success code.
    J'utilise cette fonction pour récuperer les lecteurs de cartes à puce détectés sur le PC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("listReader : '%s'\n", mszReaders);
    Si j'affiche la liste des lecteurs, même si j'en ai plusieurs, il m'en affiche toujours un seul.

    J'ai trouvé ca aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The reader names is a multi-string and separated by a nul character ('\0') and ended by a double nul character. "Reader A\0Reader B\0\0".
    Alors mes questions :

    1/ le printf n'arreterais pas l'affichage au premier '\0' rencontré ? Si oui comment faire pour tout afficher ?
    2/ j'ai essayé le strcpy() de cette facon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    readerName= (char *) malloc(256 * sizeof(char));
                    strcpy(readerName, mszReaders);
    même résultat toujours un seul lecteur alors que les deux sont bien présent...

    Quelqu'un pourrait m'aider à me dépatouiller s'il vous plait

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    printf est une fonction du C standard, il est prevu pour afficher les chaines de caracteres du C, qui sont des chaines de caracteres terminées par 0. Donc oui printf s'arrete au premier 0 rencontré. Meme chose pour strcpy et tout un tas d'autres fonctions du meme genre...

    Ton type multi-chaines est apparemment un type Windows (au vu du reste du code), donc soit il y a dans l'API Windows des fonctions dédiées à l'affichage de ce genre de trucs soit ce type n'est pas fait pour etre affiché. Regarde MSDN, en commencant par l'article sur ton type.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Je ne pense pas qu'il y ait quoi que ce soit de "prévu" pour les chaînes "multiples". Ce que tu peux faire, c'est remplacer les \0 par autre chose (genre, des \n) jusqu'à ce que tu en rencontres deux à la suite...
    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.

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    pcchReaders doit être la taille totale du buffer..

    donc il faut que tu parcoures le buffer et à chaque \0 tu testes si le nombre de char lus est < à pcchReaders.

    si oui, il y a donc une autre chaine
    si non c'est fini.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RR instinct Voir le message
    Bonjour,

    Je m'excuse si ce n'est pas tout à fait la bonne section, mais j'ai un problème relatif au C et je ne suis pas un expert...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LONG SCardListReaders(
      __in     SCARDCONTEXT hContext,
      __in     LPCTSTR mszGroups,
      __out    LPTSTR mszReaders,
      __inout  LPDWORD pcchReaders
    );
    Avec notamment la paramètre mszReaders
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mszReaders
     
        Multi-string that lists the card readers within the supplied reader groups. If this value is NULL, SCardListReaders ignores the buffer length supplied in pcchReaders, writes the length of the buffer that would have been returned if this parameter had not been NULL to pcchReaders, and returns a success code.
    J'utilise cette fonction pour récuperer les lecteurs de cartes à puce détectés sur le PC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("listReader : '%s'\n", mszReaders);
    Si j'affiche la liste des lecteurs, même si j'en ai plusieurs, il m'en affiche toujours un seul.

    J'ai trouvé ca aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The reader names is a multi-string and separated by a nul character ('\0') and ended by a double nul character. "Reader A\0Reader B\0\0".
    Alors mes questions :

    1/ le printf n'arreterais pas l'affichage au premier '\0' rencontré ? Si oui comment faire pour tout afficher ?
    2/ j'ai essayé le strcpy() de cette facon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    readerName= (char *) malloc(256 * sizeof(char));
                    strcpy(readerName, mszReaders);
    même résultat toujours un seul lecteur alors que les deux sont bien présent...

    Quelqu'un pourrait m'aider à me dépatouiller s'il vous plait

    Merci d'avance.
    Faut bien comprendre que la chaîne de caractère, c'est "un tableau terminé par \0". A partir de là, toutes les fonction qui traitent des chaînes (strlen, strcpy, strcmp et autres) s'arrêtent au premier '\0' rencontré.

    Si toi tu as un truc qui contient plusieurs '\0' à l'intérieur, déjà il te faut bien comprendre que vis à vis du C ton truc n'est pas une chaîne (ou du moins seule les infos situées avant le premier '\0' seront considérées comme chaîne) donc tu ne peux pas le faire passer à travers une fonction de traitement de chaîne (et si tu tentes quand-même ben ta fonction ne traite que le premier '\0')

    A partir de là, t'as 2 solutions
    1) tu es le maître de ce truc donc tu peux développer ton propre analyseur qui se repère, comme on l'a dit, sur autre chose qu'un '\0' (il semble qu'ici le délimiteur soit deux '\0' accolés)
    2) tu commences par convertir ce truc en chaîne en remplaçant tous les '\0' par autre chose. Puis tu traites cette chaîne comme t'en as envie puis tu retransformes cet "autre chose" en '\0' et tu te retrouves avec ton truc analysé
    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]

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Salut,

    Pour afficher la liste des lecteurs tu peux faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [...]
    char *it=mszReaders;
    do
      {
        printf("%s\n", it);
        it+=strlen(it)+1;
      }
    while(*it!='\0');
    [...]

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et pour la copie il y a memcpy , c'est fait pour ça (en particulier)...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 260
    Par défaut
    Merci pour vos réponses, je m'en doutais un peu !

    alors j'ai fais un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    strcpy(test, "TEST1\0TEST2\0\0");
     
            do {
                    printf("test : %s \n", test);
                    test+=strlen(test)+1;
            } while(*test!='\0');
    Et le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test : TEST1 
    test : h
    Pas très concluant...

  9. #9
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Ton test n'est pas correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(test, "TEST1\0TEST2\0\0");
    La variable test ne contiendra que "TEST1\0".

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Citation Envoyé par RR instinct Voir le message
    Merci pour vos réponses, je m'en doutais un peu !

    alors j'ai fais un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    strcpy(test, "TEST1\0TEST2\0\0");
     
            do {
                    printf("test : %s \n", test);
                    test+=strlen(test)+1;
            } while(*test!='\0');
    Et le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test : TEST1 
    test : h
    Pas très concluant...
    Le code suivant :
    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
      char test[]="TEST1\0TEST2\0\0";
      char *it=test;
      do
        {
          printf("test: %s\n", it);
          it+=strlen(it)+1;
        }
      while(*it!='\0');
      return 0;
    }
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test: TEST1
    test: TEST2
    ce qui est, si j'ai bien compris ton problème, le résultat escompté.

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

Discussions similaires

  1. couper une chaine contenant plusieurs regex
    Par grospatapouf dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2008, 16h21
  2. Réponses: 1
    Dernier message: 22/01/2007, 20h33
  3. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  4. Copier une chaine
    Par benito62 dans le forum C++
    Réponses: 2
    Dernier message: 27/11/2005, 20h50
  5. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04

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