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 :

Récupérer une chaîne de caractère ne C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut Récupérer une chaîne de caractère ne C
    Bonjour a tous,

    Bon je me tourne vers vous car pour un petit problème:

    J'ai une chaîne de caractère qui est de la forme suivante:


    XML result is = <?xml version='1.0'?><result><interpretation grammar="Grammar" confidence="5"><input mode="speech">OUI</input><instance><SWI_literal>OUI</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName><SWI_meaning>{SWI_literal:OUI}</SWI_meaning></instance></interpretation><interpretation grammar="Grammar" confidence="5"><input mode="speech">three</input><instance><SWI_meaning>3</SWI_meaning><RESULT confidence="5">3</RESULT><SWI_literal>three</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName></instance></interpretation></result>

    je voudrais récupérer ce qui se trouve entre les balises

    <SWI_literal>OUI</SWI_literal>.

    En gros je veux récupérer le OUI.

    Je trouve tout ça très compliqué

    Est ce que vous pouvez l'aider svp ?

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    si tu veux faire quelque chose de propre, tu peux utiliser un parser XML.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut Merci
    Merci pour la réponse,

    j'ai jamais utilisé ca, je vais me documenter pour voir.
    Et sinon, si je fais pas de façon propre, comment procéder ?

  4. #4
    Membre éprouvé

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Février 2008
    Messages : 39
    Par défaut
    Bonjour,

    Pour utiliser du C, tu peux voir les fonctions C de traitement de chaine comme par exemple strstr :

    http://www.cplusplus.com/reference/c...string/strstr/

    Cette fonction te permet de retrouver la première occurence d'une chaine passée en paramètre. Donc en cherchant ta balise ouvrante, puis ta balise fermante je pense que tu peux assez facilement retrouver le contenu.

    Bonne journée,

    Aldiemus

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    [Edit] oops, je raconte des conneries c'est du C++ ca ! Aldiemus a une solution en C[/edit]

    Avec la STL, tu cherches "<SWI_literal>" avec style chaineXML.find("<SWI_literal>") puis chaineXML.find("</SWI_literal>").
    Et avec les length & Co, tu arriveras a trouver l'intérieur de la balise.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut
    oki je vous remercie

  7. #7
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Et sinon pour le fun,

    une fonction bien crade codée en 5 minutes :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <stdio.h>
    #include <string.h>
     
     
    void CradeParser(char *balise, char *chaine){
    	char *ptr = chaine;
    	char *ptrstart = chaine;
    	char *cptr =balise;	
    	int ok = 0;
    	char *buffer = NULL;
     
    	while (ptr-chaine < strlen(chaine)){
    		if (*ptr == '<'){
    			cptr = balise;
    		 	ptr++;
     
    			ok = 1;
    			while(*ptr != '>' && ok){
    				if (*ptr != *cptr){
    					ok = 0; 
    				}
    				ptr++;
    				cptr++;
    			}
     
    			if (ok){
    				ptr++;
    				ptrstart = ptr;
     
    				while(*ptr != '<' && *ptr != '\0'){
    					ptr++;
     
    				}
    				buffer = (char *)malloc(ptr-ptrstart+1);
    				memcpy(buffer,ptrstart,ptr-ptrstart);
    				buffer[ptr-ptrstart] ='\0';
    				printf("Contenu balise %s : %s\n",balise,buffer);
    				free(buffer);
    				buffer = NULL;
    			}		
     
    		}
     
    		ptr++;
    	}
     
     
     
    }
     
    int main(int argc, char **argv){
     
    char *chaine="<?xml version='1.0'?><result><interpretation grammar=\"Grammar\" confidence=\"5\"><input mode=\"speech\">OUI</input><instance><SWI_literal>OUI</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName><SWI_meaning>{SWI_literal:OUI}</SWI_meaning></instance></interpretation><interpretation grammar=\"Grammar\" confidence=\"5\"><input mode=\"speech\">three</input><instance><SWI_meaning>3</SWI_meaning><RESULT confidence=\"5\">3</RESULT><SWI_literal>three</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName></instance></interpretation></result>";
     
     
    CradeParser("SWI_literal",chaine);
     
     
    }
    retour pourri
    Contenu balise SWI_literal : OUI
    Contenu balise SWI_literal : three

    Désolé mais j'aurai pu faire la fonction pour qu'elle te retourne un char **
    alloué dynamiquement mais la flegme du lundi est au rendez vous

    Sinon les parser tout propres c'est bien aussi c'est bien aussi

    Cordialement

  8. #8
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Allé, c'est la fête,
    Attention :
    Code non sécurisé, aucun test d'allocation, pas retest sur le retour de la fonction !!! si NULL Segfault de la mort qui tue.
    Faut pas oublier de désallouer le char ** apres avoir utilisé le retour

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
     
     
    char **CradeParser(char *balise, char *chaine){
    	char *ptr = chaine;
    	char *ptrstart = chaine;
    	char *cptr =balise;	
    	int ok = 0;
    	char **buffer = NULL;
    	char **retour = NULL;
    	int found = 0;
     
    	while (ptr-chaine < strlen(chaine)){
    		if (*ptr == '<'){
    			cptr = balise;
    			ptr++;
     
    			ok = 1;
    			while(*ptr != '>' && ok){
    				if (*ptr != *cptr){
    					ok = 0; 
    				}
    				ptr++;
    				cptr++;
    			}
     
    			if (ok){
    				ptr++;
    				ptrstart = ptr;
     
    				while(*ptr != '<' && *ptr != '\0'){
    					ptr++;
     
    				}
     
    				if (found == 0){
    					found++;
    					buffer = (char**)malloc((char *)+1);
    					buffer[found] = NULL;				
    				}else{
    					buffer = (char**)realloc(buffer,(char *)+found+1);
    					found++;
    					buffer[found] = NULL;				
     
    				}
    				buffer[found-1] = (char *)malloc(ptr-ptrstart+1);
     
    				memcpy(buffer[found-1],ptrstart,ptr-ptrstart);
    				buffer[found-1][ptr-ptrstart] ='\0';
    				printf("Contenu balise %s : %s\n",balise,buffer[found-1]);
    				//free(buffer[found-1]);
    				//buffer = NULL;
    			}		
     
    		}
     
    		ptr++;
    	}
     
    	return buffer;
    }
     
    int main(int argc, char **argv){
     
    	char *chaine="<?xml version='1.0'?><result><interpretation grammar=\"Grammar\" confidence=\"5\"><input mode=\"speech\">OUI</input><instance><SWI_literal>OUI</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName><SWI_meaning>{SWI_literal:OUI}</SWI_meaning></instance></interpretation><interpretation grammar=\"Grammar\" confidence=\"5\"><input mode=\"speech\">three</input><instance><SWI_meaning>3</SWI_meaning><RESULT confidence=\"5\">3</RESULT><SWI_literal>three</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName></instance></interpretation></result>";
     
    	char **buf = NULL;
    	int i = 0;
    	buf = CradeParser("SWI_literal",chaine);
     
     
    	while (buf[i] != NULL){
    		printf("buf%d %s\n",i,buf[i]);
    		i++;
    	}
     
    }

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut
    Citation Envoyé par Lharuun Voir le message
    Et sinon pour le fun,

    une fonction bien crade codée en 5 minutes :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <stdio.h>
    #include <string.h>
     
     
    void CradeParser(char *balise, char *chaine){
    	char *ptr = chaine;
    	char *ptrstart = chaine;
    	char *cptr =balise;	
    	int ok = 0;
    	char *buffer = NULL;
     
    	while (ptr-chaine < strlen(chaine)){
    		if (*ptr == '<'){
    			cptr = balise;
    		 	ptr++;
     
    			ok = 1;
    			while(*ptr != '>' && ok){
    				if (*ptr != *cptr){
    					ok = 0; 
    				}
    				ptr++;
    				cptr++;
    			}
     
    			if (ok){
    				ptr++;
    				ptrstart = ptr;
     
    				while(*ptr != '<' && *ptr != '\0'){
    					ptr++;
     
    				}
    				buffer = (char *)malloc(ptr-ptrstart+1);
    				memcpy(buffer,ptrstart,ptr-ptrstart);
    				buffer[ptr-ptrstart] ='\0';
    				printf("Contenu balise %s : %s\n",balise,buffer);
    				free(buffer);
    				buffer = NULL;
    			}		
     
    		}
     
    		ptr++;
    	}
     
     
     
    }
     
    int main(int argc, char **argv){
     
    char *chaine="<?xml version='1.0'?><result><interpretation grammar=\"Grammar\" confidence=\"5\"><input mode=\"speech\">OUI</input><instance><SWI_literal>OUI</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName><SWI_meaning>{SWI_literal:OUI}</SWI_meaning></instance></interpretation><interpretation grammar=\"Grammar\" confidence=\"5\"><input mode=\"speech\">three</input><instance><SWI_meaning>3</SWI_meaning><RESULT confidence=\"5\">3</RESULT><SWI_literal>three</SWI_literal><SWI_grammarName>Grammar</SWI_grammarName></instance></interpretation></result>";
     
     
    CradeParser("SWI_literal",chaine);
     
     
    }
    retour pourri



    Désolé mais j'aurai pu faire la fonction pour qu'elle te retourne un char **
    alloué dynamiquement mais la flegme du lundi est au rendez vous

    Sinon les parser tout propres c'est bien aussi c'est bien aussi

    Cordialement


    lool ! j'aime bien CradeParser . Merci pour l'aide je vais l'améliorer pour qu'elle soit un peu moin crade

    Merciiiii

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2009, 07h19
  2. sql récupérer une chaîne de caractères dans un champ
    Par ritchie23 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/05/2009, 12h12
  3. comment récupérer une chaîne de caractères
    Par the_crow_man dans le forum C
    Réponses: 8
    Dernier message: 04/07/2008, 15h39
  4. Réponses: 3
    Dernier message: 27/05/2008, 20h05
  5. [OS Perso] Récupérer une chaîne de caractères
    Par log2n dans le forum Programmation d'OS
    Réponses: 31
    Dernier message: 14/02/2006, 13h56

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