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 de decoupe d'une chaine


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut probleme de decoupe d'une chaine
    bonsoir à tous,

    j'ai un probleme a vous soumettres, encore un me direz vous ...
    en fait j'ai enfin trouvé une fonction split cependant j'ai quelques soucis avec

    voici deja le code de cette fonction

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    int split_buf(char *buf, char ***argv)
    {
        int argvsize = 8;
        int argc;
        char *s;
     
        *argv = calloc(sizeof(char *) * argvsize, 1);
        argc = 0;
        while (*buf) {
            if (argc == argvsize) {
                argvsize += 8;
                *argv = realloc(*argv, sizeof(char *) * argvsize);
            }
            if (*buf == ':') {
                (*argv)[argc++] = buf + 1;
                buf = "";
            } else {
                s = strpbrk(buf, " ");
                if (s) {
                    *s++ = 0;
                    while (*s == ' ')
                        s++;
                } else {
                    s = buf + strlen(buf);
                }
                (*argv)[argc++] = buf;
                buf = s;
            }
        }
        return argc;
    }
    je l'utilise comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	char **tab;
    	unsigned int count, i;
     
    	count = split_buf(buffer, &tab);
     
    	for (i=0;i<count;++i)
    	{
    		printf("ARRAY[%d]: %s\n", i, tab[i]);
    	}
    la chaine se decoupe bien sur de courte chaine mais lorsque je recois cette chaine par exemple:

    CAPAB CAPABILITIES :NICKMAX=32 CHANMAX=65 MAXMODES=20 IDENTMAX=12 MAXQUIT=256 MAXTOPIC=308 MAXKICK=256 MAXGECOS=129 MAXAWAY=201 IP6SUPPORT=1 PROTOCOL=1202 CHALLENGE=pgqZ{Om@keAOD``Tg~{^ HALFOP=0 PREFIX=(ov)@+ CHANMODES=abgq,k,Lfjl,CKMNOQRSTcimnprstz USERMODES=,,s,BHIRSWiorwx SVSPART=1
    voici le resultat:

    ARRAY[0]: CAPAB
    ARRAY[1]: CAPABILITIES
    ARRAY[2]: NICKMAX=32 CHANMAX=65 MAXMODES=20 IDENTMAX=12 MAXQUIT=256 MAXTOPIC=308 MAXKICK=256 MAXGECOS=129 MAXAWAY=201 IP6SUPPORT=1 PROTOCOL=1202 CHALLENGE=pgqZ{Om@keAOD``Tg~{^ HALFOP=0 PREFIX=(ov)@+ CHANMODES=abgq,k,Lfjl,CKMNOQRSTcimnprstz USERMODES=,,s,BHIRSWiorwx SVSPART=1
    elle n'est pas entierement découpé suivant les espaces, auriez vous une idée ?

    bonne soirée à vous

  2. #2
    Invité
    Invité(e)
    Par défaut
    Est-ce que tu es sûr que dans ta chaîne d'entrée tu n'as que des espaces (0x20) et pas d'espaces insécables (0xa0) ?

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le problème est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if (*buf == ':') {
                (*argv)[argc++] = buf + 1;
                buf = "";
            }
    qui écrase l'adresse buf pour mettre celle d'une chaine vide.

    Je ne sais pas ce que tu veux faire en présence d'un ':'. Si il s'agit de l'ignorer purement et simplement, ceci devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (*buf == ':')
            {
                //(*argv)[argc++] = buf + 1;
                //buf = "";
                buf++;
            }
    pour obtenir :
    ARRAY[0]: CAPAB
    ARRAY[1]: CAPABILITIES
    ARRAY[2]: NICKMAX=32
    ARRAY[3]: CHANMAX=65
    ARRAY[4]: MAXMODES=20
    ....

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    merci à vous

    en effet je cherche a ignorer ce caractère et votre méthode fonctionne très bien.

    bonne journée

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

Discussions similaires

  1. Probleme Extraction Chiffre D' Une Chaine
    Par GUYSYS dans le forum Access
    Réponses: 14
    Dernier message: 21/03/2007, 00h10
  2. Réponses: 14
    Dernier message: 26/11/2006, 13h14
  3. Réponses: 8
    Dernier message: 05/08/2006, 13h30
  4. Probleme de blanc dans une chaine
    Par Bahan dans le forum C
    Réponses: 22
    Dernier message: 25/07/2006, 16h38
  5. Probleme de coupe dans une chaine
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2005, 23h39

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