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 :

Beuggouillage...je vois pas l'erreur


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Beuggouillage...je vois pas l'erreur
    L'idée est de découpée une ligne de texte en mot...mais mon programme saute des lettre dans le decoupage et je ne vois pas d'ou cela peut provenir..

    Code de la fonction pour creer la ligne :
    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
     
    char car[2]={0}; //chaine de char contenant une lettre + caractere fin de chaine soit 2 emplacements a reserver
    char * ligne; //pointeur sur mon gros tableau
    int  i=0,j;
     
    ligne = malloc (2*sizeof(char)); //creation du gros tableau dynamique
    	if( ligne == NULL )
    	{
       	   fprintf(stderr,"Allocation impossible");
       	   exit(EXIT_FAILURE);
    	}
     
    	while (!feof(pf))
    	{  //remplir le gros tableau dynamique pour qu'il contienne la ligne.
    	   fgets(car, sizeof car, pf); //lecture dans le fichier	
               if(car[0]!=10) //si pas newligne (dc pas fin de ligne)
    	   {
    	      ligne[i]=car[0];
                  ligne = realloc (ligne, (i+1) *(2*sizeof(char)) );  //Ajout d'un element au gros tableau
    	      printf(" ligne[%d] = %c \n", i , ligne[i] );	
    	      i++;
    	 	}
    		else { 
    			DecoupeGrosTab(ligne,MaChaine); //on decoupe la ligne..cha doit faire mal
    			free(ligne); //on libère le gros tableau
    			ligne = malloc (2*sizeof(char)); //creation du gros tableau dynamique
    			if( ligne == NULL )
    			{
       			   fprintf(stderr,"Allocation impossible");
       			   exit(EXIT_FAILURE);
    			}
    			i=0; //et hop ! encore un tour...
    		}
    	}

    Code pour le decoupage de cette ligne :
    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
     
    int j=0, x=0, nbAjout=0;
    char * mot; //pointeur sur le tableau contenant mon tout petit mot
     
    mot = malloc (2*sizeof(char)); //creation du tableau dynamique pour le petit mot
    	if( mot == NULL )
    	{
       	   fprintf(stderr,"Allocation impossible");
       	   exit(EXIT_FAILURE);
    	}
    	//parcours du gros tableau
    	for (j=0 ; j<=sizeof(ligne) ; j++) {
    	   if((ligne[j]!= 32) && (!ispunct(ligne[j]))) {  //si pas espace et pas ponctuation
    		mot[x]=ligne[j];	//
    		mot = realloc (mot, x+1 *(2*sizeof(char)));  //Ajout d'un element au tableau
    		printf(" mot[%d] = %c \n", x , mot[x] );	
    		x++;
    		}
    		else	{
    			if(nbAjout==0) {
    				//MaChaine=inserer_debut(MaChaine, mot);  //on sauvegarde le mot
    				//nbAjout++;
    			}
    			//else	MaChaine=inserer_fin(MaChaine, mot); //on sauvegarde le mot
     
    			free(mot); //on detruit le mot
    			mot = malloc (2*sizeof(char)); //creation du gros tableau dynamique 
    			if( mot == NULL )
    			{
       			   fprintf(stderr,"Allocation impossible");
       			   exit(EXIT_FAILURE);
    			}
    			x=0; //et c'est reparti pour un tour !!
    		}
    	}
    }
    Le resultat suivant est obtenu :
    ligne[0] = C
    ligne[1] = o
    ligne[2] = u
    ligne[3] = c
    ligne[4] = o
    ligne[5] = u
    ligne[6] =
    ligne[7] = c
    ligne[8] = '
    ligne[9] = e
    ligne[10] = s
    ligne[11] = t
    ligne[12] =
    ligne[13] = m
    ligne[14] = o
    ligne[15] = i
    ligne[16] = !
    ligne[17] = !
    mot[0] = C
    mot[1] = o
    mot[2] = u
    mot[3] = c
    mot[4] = o
    mot[0] =
    mot[1] =
    mot[2] =
    mot[3] =
    mot[4] =

    Le remplissage du tableau ligne se fait bien...mais c'est au moment du découpage je ne comprend je ne recupère pas du tout ce qu'il faut et je ne vois pas d'où cela peut provenir...
    Merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Pour commencer j'ai un commentaire : ton utilisation de malloc est peu efficace : allouer un tableau de deux caractères pour contenir une ligne, c'est pas très malin. Alloue plutôt une taille fixée (un buffer...) par exemple 128 caractères, pour éviter des realloc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(car[0]!=10)
    (...)
    if((ligne[j]!= 32)
    Evite d'utiliser un chiffre magique. Utilise plutôt les caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(car[0] != '\n')
    etc...

    D'autre part, il me semble que fgets s'arrête lorsqu'elle rencontre un retour chariot, donc le test
    est inutile. D'autre part, remplir caractère par caractère une chaîne est loin d'être efficace, fgets peut remplir directement ton tableau ligne.

    Enfin, il est très simple de retrouver un mot dans une ligne : il s'agit des caractères précédent un espace blanc (fonction isblank() ou isspace()).


    Pour finir, un dernier commentaire : pitié, vire les commentaires du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //creation du gros tableau dynamique
    qui en plus d'être faux (un tableau de taille 2*sizeof(char) est très loin d'être gros !) est tout a fait inutile.

    Voilà, bon courage !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci pour tes conseils !! mais mon beug est toujours là snifff

    une erreur au niveau du test : (ligne[j]!= 32) && (!ispunct(ligne[j])
    corrigé par || mais ca ne change rien

  4. #4
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    reposte ton code

Discussions similaires

  1. Je vois pas mes erreurs
    Par étoile de mer dans le forum Débuter
    Réponses: 13
    Dernier message: 25/09/2008, 15h10
  2. [ImageMagick] Utilisation de getimagesize : je ne vois pas l'erreur
    Par JavaAcro dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 22/06/2006, 21h42
  3. Je ne vois pas l'erreur:( qlq pourra m'aider !
    Par moonia dans le forum Langage
    Réponses: 23
    Dernier message: 18/05/2006, 14h55
  4. Je ne vois pas l'erreur...
    Par nunurs83 dans le forum C
    Réponses: 21
    Dernier message: 16/05/2006, 21h47
  5. Clé etrangere erreur 150 mais je vois pas l'erreur
    Par HurtMarley dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 03/05/2005, 16h57

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