Help pour un probleme de pointeurs en C

Help pour un probleme de pointeurs en C - Programmation

Marsh Posté le 15-02-2002 à 08:36:17    

Bonjour a tous!
 
Je souffre actuellement d'un gros probleme de pointeurs.
Il s'agit d'une chaine de caracteres (que j'appelle ici "ch" ) qui
ne fait jamais vraiment la longueur que je veux.
Elle se met a grandir toute seule!
 
J'aurais grand besoin de votre aide.
 
Le programme sert a traiter tous les fichiers html d'un repertoire,
pour le tester il faut que vous disposiez de plusieurs fichier html dans le repertoire (avec des noms de longueur variable sinon le probleme n'apparait pas toujours).
 
Comme compilateur j'utilise celui qui est integre a Dev-C++ (une variante de gcc). Le Borland 5.5 donne des resultats un peu differents mais la cause du plantage reste la meme.
 
Voila le code compilable:
 
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define BUFSIZE 30
 
int main()
{
      FILE *fp1, *fp2, *fp;
      char buffer1[BUFSIZE], buffer2[BUFSIZE], temp_char, *ch;
      int int1, i, ii, j;
 
      //Recuperation des noms des fichiers html du repertoir courant dans "bobo.txt"
 
      system("DIR *.html /b >> bobo.txt" );
      fp1 = fopen("bobo.txt","r" );
      fgets(buffer1, BUFSIZE, fp1);
 
      //Chacun des fichiers contenus dans le fichier est traite
      //Pour cela il est ouvert puis recopie dans un fichier temporaire
 
      while ( buffer1[1] != EOF)
            {
            printf(buffer1);
            printf("\n" );
 
            i = 0;
            ii = 0;
            int1 = 0;
            int1 = (int)buffer1[i];
 
            //Le nom du fichier est recupere puis place dans la chaine "ch"
 
            while ( int1 != 10 )
                  {
                  buffer2[i] = buffer1[i];
                  i = i + 1;
                  int1 = (int)buffer1[i];
                  }
 
            ii = i;
            printf("Taille de ii: %d \n", ii);
            printf(buffer2);
            ch = (char*) malloc((ii) * sizeof(char));
            printf(ch);
            printf(" \nLongueur reelle de la chaine allouee : %d  \n", strlen(ch));
            printf("Longueur reelle de la chaine fixe : %d \n", strlen(buffer2));
 
            strncpy(ch, buffer2, (ii-1));
 
            printf("Longueur reelle de la chaine initialisee : %d \n", strlen(ch));
 
            //verification du contenu de la chaine
 
            i = 0;
            for (i = 0; i <= (ii-1); i++)
                {
                printf("%c", ch[i]);
                }
 
            //Passage par un fichier temporaire
            //C'est la qu'on voit que ca foire, le nom n'est pas le bon
 
            printf("\nResultat du changement de nom %d \n", rename(ch, "tempo.html" ));
            printf(ch);
            printf(" " );
 
            fp = fopen("tempo.html","r" );
            fp2 = fopen(ch,"w+" );
 
            while ((temp_char = fgetc(fp)) != EOF)
                  {
                  putc(temp_char, fp2);
                  }
 
            //On vide les poubelles... ...on nettoie les buffers
 
            fclose(fp);
            fclose(fp2);
            remove("tempo.html" );
            free(ch);
            fflush(stdin);
            fflush(fp);
            fflush(fp2);
            fgets(buffer1, BUFSIZE, fp1);
 
            system("pause" );
 
            }
 
      return 0;
}
 
Merci d'avance.  :jap:  
 
PS: j'ai essaye d'expliquer un peu mon code mais ce n'est pas brillant, n'hesitez pas a me demander des explications!

Reply

Marsh Posté le 15-02-2002 à 08:36:17   

Reply

Marsh Posté le 15-02-2002 à 08:57:56    

après ton malloc pour "ch", essaye de faire un  

Code :
  1. memset (ch, 0, sizeof (ch));

Reply

Marsh Posté le 15-02-2002 à 09:00:34    

j'ai pas tout lu mais il faut toujours allouer une place en + pour le \0.


---------------
Super.
Reply

Marsh Posté le 15-02-2002 à 10:00:15    

Godbout a écrit a écrit :

j'ai pas tout lu mais il faut toujours allouer une place en + pour le \0.  




 
oui et il faut ajouter le \0 après initialisation


---------------
Je ne suis ni pour, ni contre, bien au contraire  
Reply

Marsh Posté le 15-02-2002 à 10:18:39    

ben le memset de El_gringo remplit la chaine avec des \0.


---------------
Super.
Reply

Marsh Posté le 15-02-2002 à 10:24:01    

j'avais pas vu :jap:


---------------
Je ne suis ni pour, ni contre, bien au contraire  
Reply

Marsh Posté le 15-02-2002 à 10:29:11    

pas de prob ;)
 
Par contre y a une autre facon de remplir une chaine statique et j'aurais bien voulu savoir si c'est standard ou pas (parce qu'apparemment pas bcp de gens connaissent)
 
char chaine[255] = {0};
 
ca remplit chaine[0] jusque chaine[254] de 0 sous Visual C++.

 

[jfdsdjhfuetppo]--Message édité par Godbout--[/jfdsdjhfuetppo]


---------------
Super.
Reply

Marsh Posté le 15-02-2002 à 10:48:17    

Lors de la déclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades. Il faut évidemment veiller à ce que le nombre de valeurs dans la liste corresponde à la dimension du tableau. Si la liste ne contient pas assez de valeurs pour toutes les composantes, les composantes restantes sont initialisées par zéro.
 
Donc:  
char chaine[255] = {0};  
execute chaine[0] = 0; et met des 0 dans le reste du tableau.
A priori, chaine[255] = {1}; rangera 1 dans la premiere case du tableau chaine (chaine[0]), et mettra des 0 dans les 254 autres.
 
autre exemple plus explicite:
http://www.ltam.lu/Tutoriel_Ansi_C/prg-c21.gif
http://www.ltam.lu/Tutoriel_Ansi_C/prg-c22.gif
http://www.ltam.lu/Tutoriel_Ansi_C/prg-c23.gif
(honteusement pompé dans http://www.ltam.lu/Tutoriel_Ansi_C/ )
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-02-2002 à 11:00:50    

:jap:
 
Eh ben ca c'est de la reponse !! [:fifiz]


---------------
Super.
Reply

Marsh Posté le 18-02-2002 à 05:17:52    

Salut a tous!
 
Je tenais a vous remercier pour l'aide apportee
 :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  
 
Et plus particulierement Godbout  
 :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  
 
Qui m'a apporte la solution le premier:
terminer la chaine par "\0".
 
Encore merci!
 
charcutrix

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed