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 extraction de chaine de caracteres


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 41
    Points
    41
    Par défaut probleme extraction de chaine de caracteres
    Bonsoir

    je veux recuperer une sous chaine de caractere. J utilise la fonction str_sub qui se trouve ici:
    http://nicolasj.developpez.com/articles/libc/string/

    Normalement cette fonction copie la sous chaine donner par les indice.
    Or j ai un probleme que je n explique pas.

    Voici mon code:

    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
    char *str_subs(const char *s, unsigned int start, unsigned int end) {
     
    	char *str;
    	int i;
     
    	str = NULL;
     
    	if (s != NULL && start < end) {
    		str = (char *) malloc(sizeof(char) * (end - start + 2));
     
    		if (str != NULL) {
    			for (i = 0; i <= end; i++) {
    				str[i - start] = s[i];
    			}
    			str[i] = '\0'; // j ai rajouter ceci pour mettre le caractere de fin.
    		}
     
    		else {
    			fprintf(stderr, "error malloc(): not enough memmory.\n");
    			exit(EXIT_FAILURE);
    		}
    	}
     
    	return str;
    }
     
    int main() {
    	char *s = "qwertyuiop";
    	char *ss = str_subs(s, 0, 3);
     
    	printf("ss :  %s  %d\n", ss, strlen(ss));
    	s = str_subs(s, 4, 10);	
    	printf("\ns :  %s  %d\n", s, strlen(s));
    	printf("ss :  %s  %d\n", ss, strlen(ss));
     
    	printf("\nss :  %s  %d\n", ss, strlen(ss));
    	free(ss);
     
    	printf("%s\n%d\n", s, strlen(s));
    	free(s);
    }
    Voici ce que j obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ss :  qwer  4
     
    s :  tyuiop  6
    ss :  qwer  4
     
    ss :  qwer  4
    *** glibc detected *** free(): invalid next size (fast): 0x0804a008 ***
    Aborted

  2. #2
    mat.M
    Invité(e)
    Par défaut
    str = (char *) malloc(sizeof(char) * (end - start + 2));
    je ne vois pas de free correspondant...

    for (i = 0; i <= end; i++) { str[i - start] = s[i];
    que se passe-t-il si start<0 ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par mat.M
    je ne vois pas de free correspondant...
    c 'est la valeur retournee , de plus une fois que le malloc est bien realise, normalement il n y a plus d erreur a gerer.


    Citation Envoyé par mat.M
    que se passe-t-il si start<0 ?
    ca fait un segmentation fault .... Mais normalement jamais on devrais avoir ce cas la....

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par mat.M
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = (char *) malloc(sizeof(char) * (end - start + 2));
    je ne vois pas de free correspondant...
    Bin normal ... str est le pointeur qui est retourné par la fonction !

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par nivose110
    ca fait un segmentation fault .... Mais normalement jamais on devrais avoir ce cas la....
    Mieux vaut prévenir que guérrir

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par mat.M
    que se passe-t-il si start<0 ?
    start est un unsigned int, il ne peut donc être en aucun cas négatif, le compilo n'approuvera jamais

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    oui .... et mon probleme est toujours pas resolu ... Ne pas s egarer

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ss = str_subs(s, 4, 10);
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = str_subs(s, 4, 10);

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 41
    Points
    41
    Par défaut
    normalement cec que j ai fait est juste.

    Ce que je comprend pas , c est pourquoi ca deconne, alors que la fonction str_subs recopie la sous chaine.

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    alors que la fonction str_subs recopie la sous chaine.
    Elle renvoie un pointeur sur la sous chaine.
    Or la valeur de ce pointeur est affectée au pointeur se la chaine originale d'où le problème.
    En mettant "ss" au lieu de "s" on recopie le pointeur de la sous chaine dans le pointeur qui sert pour les sous chaines.

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Voici le main:
    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
     
    int main (void)
    {
       const char *s = "qwertyuiop";
       char *ss = NULL;
     
     
       printf("s :  %s  %d\n", s, strlen(s));
     
     
       ss = str_subs(s, 0, 3);
       printf("ss :  %s  %d\n", ss, strlen(ss));
       free (ss);
     
       ss = str_subs(s, 4, 10);
       printf("ss :  %s  %d\n", ss, strlen(ss));
       free (ss);
     
     
       return EXIT_SUCCESS;
    }
    n'oublie pas aussi que main retourne toujours un int

  12. #12
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nivose110
    Bonsoir

    je veux recuperer une sous chaine de caractere. J utilise la fonction str_sub qui se trouve ici:
    http://nicolasj.developpez.com/articles/libc/string/
    <...>
    Voici ce que j obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ss :  qwer  4
     
    s :  tyuiop  6
    ss :  qwer  4
     
    ss :  qwer  4
    *** glibc detected *** free(): invalid next size (fast): 0x0804a008 ***
    Aborted
    Comme toujours, une bonne instrumentation permet de detecter l'intrus...
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
     
    char *str_subs (const char *s, unsigned int start, unsigned int end)
    {
       char *str = NULL;
     
       if (s != NULL && start < end)
       {
          size_t const size = (end - start + 2);
          str = malloc (size);
          if (str != NULL)
          {
             int i;
             for (i = 0; i <= end; i++)
             {
                assert (i - start < size);
                assert (i < size);
                str[i - start] = s[i];
             }
          }
          else
          {
             fprintf (stderr, "error malloc(): not enough memmory.\n");
             exit (EXIT_FAILURE);
          }
       }
     
       return str;
    }
     
    int main ()
    {
       char const *sx = "abcdefghijklm";
       printf ("sx = '%s' len = %d\n", sx, strlen (sx));
     
       char *sa = str_subs (sx, 0, 3);
       if (sa != NULL)
       {
          printf ("sa = '%s' len = %d\n", sa, strlen (sa));
     
          char *sb = str_subs (sx, 4, 8);
          if (sb != NULL)
          {
             printf ("sb = '%s' len = %d\n", sb, strlen (sb));
     
             free (sb), sb = NULL;
          }
          free (sa), sa = NULL;
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sx = 'abcdefghijklm' len = 13
    sa = 'abcd♀' len = 5
    Assertion failed: i - start < size, file main.c, line 53
     
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
     
    Press ENTER to continue.
    Ne pas faire de soustractions avec les unsigned. Ca tue...

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Franck.H
    Tout bien refléchit elle est un peu nulle ta question ... [B]
    Eh dis donc Franck H je ne t'insulte pas alors modère un peu tes propos merci !
    1-Ici je respecte les gens alors fais la même chose avec les autres personnes encore une fois merci.
    2-Lire bien attentivement les règles du forum
    3-je ne t'ai pas sollicité

    Ce code porte à confusion voilà la cause de mes erreurs

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par mat.M
    Eh dis donc Franck H je ne t'insulte pas alors modère un peu tes propos merci !
    Ici je respecte les gens alors fais la même chose avec les autres personnes encore une fois merci.
    Lire bien attentivement les règles du forum
    Ce code c'est un peu foutoir
    Bin désolé mais je ne voyais pas d'insulte sous cette forme ... tanpis

    Je ne faisait que faire remarquer une petite erreur d'interprétation du code rien de plus, je ne vois pas en quoi j'était vexant m'enfin bon soit, je m'excuse, ce n'était pas dans mes intentions !

Discussions similaires

  1. probleme avec les chaines de caracteres
    Par snake77350 dans le forum C
    Réponses: 11
    Dernier message: 25/04/2006, 19h29
  2. Probleme avec une chaine de caractere
    Par Jim_Nastiq dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 10h56
  3. probleme sur les chaines de caractere
    Par foufi5 dans le forum C
    Réponses: 8
    Dernier message: 22/12/2005, 16h30
  4. [XSLT] Extraction de chaine de caractere
    Par Hugo001 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 28/10/2004, 09h27
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 20h01

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