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 :

expression réguliere [Tutoriel]


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut expression réguliere
    bonjour,
    j'ai un petit problème d'expression réguliere. Je voudrais afficher le résultat de la recherche.

    La recherche trouve bien un résultat mais je n'arrive pas à exploiter la structure regmatch_t pour afficher le résultat.

    Voici le source

    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
     
    #include <stdio.h>
    #include <regex.h>
     
    #define BUFFER_SIZE 512
     
    void cherche (char* pattern, FILE *f){
    	int codeRetour;
    	regex_t re;
    	char buffer[BUFFER_SIZE];
    	regmatch_t resultat[10];  // On stocke 10 occurences
     
    	// Compilation de l'expression . Pour les tests on cherche COUCOU
    	if ((codeRetour=regcomp( &re, "COUCOU", REG_EXTENDED))!=0){
    		// Erreur de compile
    		regerror(codeRetour, &re, buffer, sizeof buffer);
    		fprintf(stderr, "Err compilation expression: %s (%s)\n", buffer, pattern);
    		return;
    	}
     
     
    	while (fgets(buffer, BUFFER_SIZE, f) != NULL){
    		// On cherche 
    		if (regexec(&re, buffer, 10, resultat,0)==0){
    			// On affiche la ligne 
    		//	fputs(buffer, stdout);
    			fprintf(stdout ,"Résultat --> %s\n",resultat[1] );
    		} else {
    			fprintf(stderr ,"Pas de résultat\n");
    		}
    	}
    	//libere la memoire
    	regfree(&re);
    }
     
    int main (int argc, char **argv){
    //	argc++;
    //	argv++;	
    	cherche(*argv, stdin);
    }
    Et voici un exemple d'utilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    htristra@1[src]$ ../exec/essai
    toto
    Pas de résultat
    COUCOU
    Résultat --> (null)
    Est ce que quelqu'un a une idée ?
    Je trouve pas beaucoup d'exemple sur le net, si quelqu'un a une bonne adresse....

    Merci de votre aide

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    ton code ressemble plus à du C qu'a du C++, c'est la porte juste au dessus! Demande à un modérateur de déplacer ton sujet.

    C'est normal que le pointeur de type FILE soit obtenu de la ligne de commande? Il devrait provenir de fopen
    Pour te simplifier la vie, il existe une constante BUFSIZ déclarée dans stdlib.h pour avoir une taille optimal de tampon.
    Pour finir la fonction main retourne un int pourquoi je ne voi pas de return ?

    Pour ce qui est de la documentation sur les expressions régulières, effectivement il n'y a pas grand chose, j'en ai aussi cherché cette aprés midi et je n'ai pas trouvé grand chose, à part : man regex sous google et la doc fourni avec la bibliothèque.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,
    ton code ressemble plus à du C qu'a du C++, c'est la porte juste au dessus! Demande à un modérateur de déplacer ton sujet.
    Ok je fais.
    Citation Envoyé par gege2061
    C'est normal que le pointeur de type FILE soit obtenu de la ligne de commande? Il devrait provenir de fopen
    Pour te simplifier la vie, il existe une constante BUFSIZ déclarée dans stdlib.h pour avoir une taille optimal de tampon.
    Pour finir la fonction main retourne un int pourquoi je ne voi pas de return ?
    C'est une partie du code. Normalement la fonction recherche recoit un pointeur. J'ai simplifié pour que ce soit plus lisible ( je débute et c'est pas toujours tres claire....)
    Merci pour la stdlib.h, je regarde

    Citation Envoyé par gege2061
    Pour ce qui est de la documentation sur les expressions régulières, effectivement il n'y a pas grand chose, j'en ai aussi cherché cette aprés midi et je n'ai pas trouvé grand chose, à part : man regex sous google et la doc fourni avec la bibliothèque
    Merci de ton aide

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    boost.regex : ce qui ressemble le plus à ce qui risque d'être intégré au prochain standard C++ (!= C).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par htristra
    J'ai simplifié pour que ce soit plus lisible
    Peut être un peu trop! Si tu pouvais nous redonner un code correcte (s'il n'est pas trop long tu peut simplemeent faire un copier/coller, on se débroillera de la partie lisibilité!).

    Il y a une erreur au niveau de l'affichage des résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    regmatch_t resultat[10];
    ...
    fprintf(stdout ,"Résultat --> %s\n",resultat[1] );
    regmatch_t n'est pas un typedef pour une chaîne de caractères mais une structure dont voici la définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
      regoff_t rm_so;
      regoff_t rm_eo;
    } regmatch_t;
    rm_so est le byte de départ de la chaîne reconnue et rm_eo celui de fin. Il faut ensuite que tu retrouve la sous-chaîne dans la chaîne de départ.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    Bonjour,
    J'ai bien potassé les infos de gege2061, merci à lui.

    J'ai refait le tout en plus claire et plus propre (j'espere en tout cas !)

    La recherche marche bien. J'ai juste un seg fault quand je fais le regfree. D'aprés valgrind, l'adresse n'est plus accessible !
    Est ce que quelqu'un a une idée.
    Voici le source

    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
     
    #include <stdio.h>
    #include <regex.h>
    #include <string.h>
    #include <string>
    #include <fstream>
    #include <iostream>
     
    //#define BUFFER_SIZE 512
     
    void extraireChaine(char** destination, char* source, int posDebut, int posFin){
    // Permet l'extraction de la chaine 
    	int tailleResult;
    	size_t taille = 0;
     
    	if(source != NULL) {
        tailleResult = posFin - posDebut;
        	if(tailleResult > 0) {
    			taille = (size_t) tailleResult;
    			taille += 1;
    			(*destination) = new char[taille];
    			memcpy((*destination), &(source[posDebut]), tailleResult);
    			(*destination)[tailleResult] = '\0';
    		}
    	} else {
    		*destination = NULL ;
    	}
    }
     
     
    int main (int argc, char **argv){
    	std::ifstream fichier( "/home/adm/exec/pj.html" );
    	std::string buffer; 
        if ( fichier ) {
    		std::string ligne; // variable contenant chaque ligne lue
    		while ( std::getline( fichier, ligne ) ) 
    			buffer+= ligne ;
    	}
     
    	// On passe du type string vers char pour pouvoir utiliser les expression régulieres
    	size_t size = buffer.size() + 1;
    	char donnee[size];
    	strncpy( donnee, buffer.c_str(), size );
    	fichier.close();
     
    	int codeRetour;
    	regex_t *re;
    	regmatch_t pmatch;
    	re = (regex_t *)malloc(sizeof(regex_t)); 
    	// Compilation de l'expression 
    	if ((codeRetour=regcomp( re, "[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}", REG_EXTENDED))!=0){
    		// Erreur de compile
    		regerror(codeRetour, re, donnee, sizeof buffer);
    		fprintf(stderr, "Err compilation expression: %s (%s)\n", donnee);
    		exit(1);
    	}
     
    	// On cherche 
    	if (regexec(re, donnee, 10, &pmatch,0)==0){
    		// Si il y a un résultat, on affiche la ligne 
    		char* chaine; 
    		extraireChaine(&chaine, donnee, pmatch.rm_so, pmatch.rm_eo); // Extrait la chaine de la source
    		std::cout << chaine << '\n';
    	} else {
    		std::cout << "Pas de résultat\n" ;
    	}
    	//libere la memoire
    	regfree(re);
     
    }
    Voici la sortie de valgrind

    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
     
    htristra@1[src]$ valgrind   ../exec/essai
    ==5177== Memcheck, a memory error detector for x86-linux.
    ==5177== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
    ==5177== Using valgrind-2.4.0, a program supervision framework for x86-linux.
    ==5177== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
    ==5177== For more details, rerun with: -v
    ==5177==
    01 45 99 99 00
    ==5177== Invalid read of size 4
    ==5177==    at 0x410CDFDA: regfree (in /lib/tls/libc-2.3.2.so)
    ==5177==    by 0x8048FB2: main (essai.cpp:67)
    ==5177==  Address 0xFFFFFFFF is not stack'd, malloc'd or (recently) free'd
    ==5177==
    ==5177== Process terminating with default action of signal 11 (SIGSEGV)
    ==5177==  GPF (Pointer out of bounds?)
    ==5177==    at 0x410CDFDA: regfree (in /lib/tls/libc-2.3.2.so)
    ==5177==    by 0x8048FB2: main (essai.cpp:67)
    ==5177==
    ==5177== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 15 from 1)
    ==5177== malloc/free: in use at exit: 86375 bytes in 200 blocks.
    ==5177== malloc/free: 496 allocs, 296 frees, 247041 bytes allocated.
    ==5177== For counts of detected errors, rerun with: -v
    ==5177== searching for pointers to 200 not-freed blocks.
    ==5177== checked 204812 bytes.
    ==5177==
    ==5177== LEAK SUMMARY:
    ==5177==    definitely lost: 86360 bytes in 199 blocks.
    ==5177==      possibly lost: 0 bytes in 0 blocks.
    ==5177==    still reachable: 15 bytes in 1 blocks.
    ==5177==         suppressed: 0 bytes in 0 blocks.
    ==5177== Use --leak-check=full to see details of leaked memory.
    Erreur de segmentation
    htristra@1[src]$
    Merci encore pour votre aide, ça m'a bien aidé.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par htristra
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <string>
    #include <fstream>
    #include <iostream>
    Gni ? Pas du C. C++, c'est le forum d'à coté.

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    désolé mais tu fais un mixe C - C++ qui ne peut conduire qu'a des erreurs! Si tu fait du C++, utilise les opérateur new et delete et tous les trucs que je ne connait pas en C++ qui te facilite la vie y compri un certain boost.regex que t'as conseillé Luc Hermitte.

    Si tu fait tu C vire tout et recommence!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexec(re, donnee, 10, &pmatch,0)
    Le troisième argument de regexec et le nombre d'élémént du tableau pmatch or tu déclare :
    Soit un élément !

    J'ai écri un article la dessus, voici le code pour récupérer une sous chaîne : Extraire une sous chaîne correspondant à un motif

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Gni ? Pas du C. C++, c'est le forum d'à coté.
    Désolé, hier c'était dans le forum C++, au vue du premier message j'ai cru à du C
    De toute façon la bibliothèque regex c'est du C, en C++ ils ont boost.regex.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    merci tous le monde.
    En effet je crois que je fais un mixte de C et C++.
    Je débute en C et j'ai encore un peu de mal à faire la différence entre le C et le C++.
    Je crois que je vais refaire le tout en me basant sur l'exemple de gege2061. Je vois le principe. Il faut juste que j'ajoute ce qu'il faut pour extraire toute les occurence.

    Si vous le permettez, je posterais le résultat pour avoir votre avis et surtout vos conseilles.

    Merci encore milles fois

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par htristra
    Il faut juste que j'ajoute ce qu'il faut pour extraire toute les occurence.
    Une petite boucle for de 0 jusqu'à nmatch (exclu) et le tours est joué

    Citation Envoyé par htristra
    Si vous le permettez, je posterais le résultat pour avoir votre avis et surtout vos conseilles.
    Sans problème!

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    Coucou tout le monde, me revoila. J'ai mis un peu de temps à répondre mais j'étais en vacance et j'ai du lire pas mal de page de man

    Je pense que gege2061 n'a pas bien compris ce que je voulais faire. Si je me base sur son exemple, l'idée est d'extraire toutes les adresses de sites web.
    La boucle sur nmatch permet (si j'ai bien pigé les man !!) d'isoler les sous-chaînes entre parenthéses. Par exemple si l'expression est :
    (www\\.)([-_[:alnum:]]+)(\\.[[:lower:]]{2,4})
    pour nmatch=0, les offsets isolent www.developpez.com
    pour nmatch=1, les offsets isolent www.
    pour nmatch=2, les offsets isolent developpez.com

    J'ai fait quelques essais rapides mais je n'ai pas encore réussi à faire ça bien proprement. J'insiste sur le fait que ce sont des suppositions donc ceux d'entre vous qui lisent ceci devrait vérifier un peu.

    Bon, sinon je me suis inspiré du code de gege2061 pour faire mon truc (trouver toutes les adresses de site).
    C'est un peu mal écris (beaucoup diront certain) mais je suis en train de le refaire en beaucoup plus propre pour que ce soit plus facilement réutilisable.
    Si cela peut aider quelqu'un a mieux comprendre, je serais content, j'ai essayé de mettre pas mal de commentaires. D'ailleurs gege, il en a un qui te concerne. C'est par rapport au else sur le regex, tu en pense quoi ?
    voici donc mon premier source en C qui ne me fait pas de segfault

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <regex.h>
     
    int main (void)
    {
     
    	int err;
    	regex_t preg;
    	char *entree = "http://<a href="http://www.developpez.net/forums/index.php" target="_blank">www.developpez.net/forums/index.php</a>  http://www.monsiteamoi.com/index.php";
    	// On copie entree dans str_request aprés un malloc pour pouvoir faire du realloc ensuite
    	char *str_request ;
    	str_request = malloc(strlen(entree));
    	strncpy(str_request,entree,strlen(entree));
     
    	const char *str_regex = "(www\\.[-_[:alnum:]]+)(\\.[[:lower:]]{2,4})";
    	// On compile l'expression 
    	err = regcomp (&preg, str_regex, REG_EXTENDED);
    	if (err == 0) {
    		/* On ne fait le test de réussite de la compilation qu'une fois,
    		Si ca marche une fois, ca marche tout le temps !! */
    		int match;
    		size_t nmatch = 0;
    		regmatch_t *pmatch = NULL;
    		nmatch = preg.re_nsub;
    		pmatch = malloc (sizeof (*pmatch) * nmatch);
     
    		if (pmatch){
    			char *site = NULL ; // Utiliser pour stocker le résultat de la recherche 
    			char *tmp = NULL; // Utiliser pour stocker temporairement la nouvelle valeure de str_request pendant sa modification
    			while (1){
    				nmatch = preg.re_nsub;
    				//pmatch = malloc (sizeof (*pmatch) * nmatch);
    				pmatch = realloc (pmatch, sizeof (*pmatch) * nmatch);
    				err = regcomp (&preg, str_regex, REG_EXTENDED);
     
    				nmatch = 0;
    				pmatch = NULL;
    				nmatch = preg.re_nsub;
    				pmatch = (regmatch_t *) realloc (pmatch, sizeof (*pmatch) * nmatch);
    				match = regexec (&preg, str_request, nmatch, pmatch, 0);
    				/* Il faut toujours faire un regfree et recompiler l'expression avant le regexec
    				Dès que le regexec a été effectué, on peut faire le regfree*/
    				regfree (&preg);
    				if (match == 0){ // Si match==0, c'est que nous avons un résultat
    					/*  pmatch[0].rm_so contient l'offset du début de la correspondance soit le premier w
    					pmatch[0].rm_eo contient l'offset de la fin de la correspondance soit le t de .net pour la premiére boucle */
    					int start = pmatch[0].rm_so; 
    					int end = pmatch[0].rm_eo;
    					size_t size = end - start ;
    					site = (char *)realloc(site, sizeof(*site) * size );
     
    					if (site){
    						strncpy (site, &str_request[start], size);
    						printf ("%s\n", site);
    					}
    					/* On va réduire la variable str_request en prenant comme point de départ la fin de correspondance de l'expression réguliere. Notez bien que le http:// du début saute meme si il ne fait pas parti du résultat.
    					Après la premiere passe il reste donc /forums/index.php  http://www.monsiteamoi.com/index.php
    					*/
    					tmp=(char *)realloc(tmp,strlen(str_request)-size);
    					strncpy(tmp,&str_request[end],strlen(str_request)-size);
    					str_request=realloc(str_request,strlen(str_request)-size);
    					str_request=tmp;
    					site=NULL;
    				} else if (match == REG_NOMATCH) { // L'expression réguliere ne retourne rien 
    					printf ("%s n\'est pas une adresse internet valide\n", str_request);
    					break;
    				} else {
    				/* ce bloc else, je le laisse car gege2061 l'a mis mais je pense qu'on ira jamais car regexec ne retourne que 0 ou REG_NOMATCH. Ce bloc trouve plus sa place en d'erreur sur regcomp (comme en dessous)
    				*/
    					char *text;
    					size_t size;
    					size = regerror (err, &preg, NULL, 0);
    					text = malloc (sizeof (*text) * size);
    					if (text) {
    						regerror (err, &preg, text, size);
    						fprintf (stderr, "%s\n", text);
    						free (text);
    					} else {
    						fprintf (stderr, "Memoire insuffisante\n");
    						exit (EXIT_FAILURE);
    					}
    					break;
    				}
    			}
    		} else {
    		// Erreur d'allocation mémoire (ca peut vraiment arrivé ?? ( question pour gege2061)
    			fprintf (stderr, "Memoire insuffisante\n");
    			exit (EXIT_FAILURE);
    		}
    	} else {
    		// Erreur de compilation de l'expression réguliére
    		char *text;
    		size_t size;
    		size = regerror (err, &preg, NULL, 0);
    		text = malloc (sizeof (*text) * size);
    		if (text) {
    			regerror (err, &preg, text, size);
    			fprintf (stderr, "%s\n", text);
    			free (text);
    		} else {
    			fprintf (stderr, "Memoire insuffisante\n");
    			exit (EXIT_FAILURE);
    		}	
    	}
     
     
    	puts ("\nPress any key\n");
    /* Dev-cpp */
       getchar ();
       return (EXIT_SUCCESS);
    }
    Je suis preneur pour toutes remarques !!!

    Merci pour votre aide

Discussions similaires

  1. [Debutant] Expression réguliere
    Par grizzz dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 17/08/2007, 16h14
  2. [RegEx] Expressions régulieres
    Par crazymickey dans le forum Langage
    Réponses: 8
    Dernier message: 23/09/2005, 21h06
  3. expression réguliere en c++
    Par alambics dans le forum MFC
    Réponses: 9
    Dernier message: 10/03/2004, 20h19
  4. expression réguliere
    Par alambics dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/03/2004, 13h52

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