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 :

Problème avec un tableau de chaines de caractères


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1
    Par défaut Problème avec un tableau de chaines de caractères
    Bonjour,
    j'ai un petit problème avec les tableaux de chaines de caractères(char**)
    Je souhaite stocker dans ce tableau les differents blocs de caracteres contenu dans une chaine de caractere.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char** argv;
    int size=test("aa bb", argv);
    int i;
    for(i=0; i<j; i++){
    printf("%s\n", argv[i]);
    }
    devrait m'afficher "aa" puis "bb"

    Mon probleme est que j'ai une erreur de segmentation lorsque que je veut reutiliser argv dans le main.
    Par contre si j'affiche argv dans ma fonction test il n'y a pas de probleme.

    Voici mon code en espérant que quelqu'un pourra m'aider:

    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 <stdlib.h>
    #include <unistd.h>
    #include <string.h>
     
    /*permet de stocket les blocs de caractère le buff dans le tableau de char* argv*/
    int test(char* buff, char** argv){
    	char* buff2=malloc(1);	/*stocke temporairement un block de caractere*/
    	int i=0;	/*position dans buff*/
    	int j=0;	/*taille de argv*/
    	int stop=0;	/*indique la fin de la chaine buff*/
    	while(!stop){
    		/*On recupere le premier bloc de caractere*/
    		while(buff[i]!=' ' && buff[i]!='\0'){
    			buff2=realloc(buff2, strlen(buff2)+2);
    			sprintf(buff2, "%s%c", buff2, buff[i]);
    			i++;
    		}
    		/*si lz bloc n'est pas vide on le stocke dans argv*/
    		if(strlen(buff2)>0){
    			argv=realloc(argv, (j+1)*sizeof(char*));
    			argv[j]=malloc(strlen(buff2)+1);			
    			strcpy(argv[j], buff2);
    			j++;
     
    		}
    		/*on se déplace dans buff tant qu'on a des espaces*/
    		while(buff[i]==' ') i++;
    		if(buff[i]=='\0'){
    			stop=1;
    			printf("STOP\n");
    		}
    		/*on reinitialise buff*/
    		buff2=realloc(NULL, 1);
    		strcpy(buff2, "\0");
    	}
     
    	/*1er affichage de argv*/
    	for(i=0; i<j; i++){
    		printf("%s\n", argv[i]);
    	}
    	return j;
    }
     
    main(){
     
    	char** argv=malloc(sizeof(char*));
     
     
    	int j=test("aa b", argv);
     
     
    	int i;
    	for(i=0; i<j; i++){
    		printf("%s\n", argv[i]);
    	}
     
    	return 0;
     
    }
    Aucun probleme a la compilation
    mais a l'exécution j'ai :
    aa
    b
    /*L'affichage dans la fonction test marche*/
    erreur de segmentation

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Tu as surtout de la chance que ton programme fonctionne comme tu le dis.
    Tu as beaucoup de problème dans la gestion des pointeurs.
    Reprenons dans l'ordre :
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int test(char* buff, char** argv)
    Si tu veux faire un argv = realloc(argv...), dans cette fonction, alors il te faut pouvoir modifier l'adresse contenu par le paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int test(char* buff, char*** argv)
    2/
    Ceci alloue un espace mémoire mais n'en initialise pas le contenu. Donc, lorsqu'ensuite tu fais strlen(buff2), tu ne sait pas ce que contient buff2, donc . Ta version marche car en mode debug la mémoire doit être initialisée à 0 dans ton environnement. Mais dans un autre environnement ou en release, c'est l'erreur assurée.

    3/C'est une façon incorrecte de faire un realloc, car si celui-ci échoue tu perds ton premier alloc, donc tu as une fuite mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char **p_new;
    p_new = realloc(argv,...);
    if(NULL!=p_new){
       argv = p_new
    }
    else{/* gestion de l'erreur */
    }
    4/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buff2=realloc(NULL, 1);
    Tu perds l'ancienne valeur pointée par buff2. Pour rappel, rien ne t'interdit de faire un realloc sur une taille plus petite que celle originellement pointée, même si en pratique cela présent peu d'intérêt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buff2=realloc(buff2, 1);
    Bon, pour revenir à ton algo à proprement parlé. Il est beaucoup trop compliqué pour ce que tu veux faire. Tu as mis trop de pointeur à mon sens. Tu devrais essayé quelque chose de plus simple (ceci n'est pas du C !) :
    Decouper(const char *sz_chaine , char ***ppsz_resultat)
    const char *p_courant = sz_chaine;
    const char *p_debut_sous_chaine = sz_chaine;
    size_t nbr_elements = 0;
    *ppsz_resultat = NULL;
    Tant que p_courant!=0
    Si p_courant==' '
    Incrementé nbr_elements
    Reallouer *ppsz_resultat
    Ajouter la nouvelle chaine qui commence en p_debut_sous_chaine et qui a comme taille (p_courant-p_debut_sous_chaine)
    Incrémenter p_courant
    p_debut_sous_chaine devient p_courant
    Sinon
    p_courant++;
    Fin Tant que
    Idem pour la dernière chaîne.

Discussions similaires

  1. problème avec tableau de chaine de caractères
    Par soumti84 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/04/2009, 14h07
  2. Problème avec tableau de chaine de caractères
    Par saubin dans le forum Débuter
    Réponses: 9
    Dernier message: 31/10/2008, 20h11
  3. Réponses: 2
    Dernier message: 07/06/2008, 16h23
  4. Réponses: 3
    Dernier message: 20/02/2008, 22h36
  5. Réponses: 5
    Dernier message: 24/05/2006, 08h59

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