Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1565 connectés 

  FORUM HardWare.fr
  Programmation

  Help pour un probleme de pointeurs en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Help pour un probleme de pointeurs en C

n°100645
charcutrix
Posté le 15-02-2002 à 08:36:17  profilanswer
 

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!

mood
Publicité
Posté le 15-02-2002 à 08:36:17  profilanswer
 

n°100651
El_gringo
Posté le 15-02-2002 à 08:57:56  profilanswer
 

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

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

n°100655
godbout
Génial.
Posté le 15-02-2002 à 09:00:34  profilanswer
 

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


---------------
Super.
n°100678
jupiler
Un cousin...
Posté le 15-02-2002 à 10:00:15  profilanswer
 

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  
n°100696
godbout
Génial.
Posté le 15-02-2002 à 10:18:39  profilanswer
 

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


---------------
Super.
n°100705
jupiler
Un cousin...
Posté le 15-02-2002 à 10:24:01  profilanswer
 

j'avais pas vu :jap:


---------------
Je ne suis ni pour, ni contre, bien au contraire  
n°100707
godbout
Génial.
Posté le 15-02-2002 à 10:29:11  profilanswer
 

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.
n°100717
gilou
Modérateur
Modzilla
Posté le 15-02-2002 à 10:48:17  profilanswer
 

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é!  --
n°100725
godbout
Génial.
Posté le 15-02-2002 à 11:00:50  profilanswer
 

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


---------------
Super.
n°101661
charcutrix
Posté le 18-02-2002 à 05:17:52  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Help pour un probleme de pointeurs en C

 

Sujets relatifs
Sh@dar please ! Probleme de SESSION en PHPproblème de programmation du clavier
Help lien php[ADA] Pointeurs...
[ASP IIS]probleme d'ecriture[Java] problème d'accents
[PHP] [MySQL] Problème d'utilisateurs....[c] probleme initialisation matrice
[SQL] problème avec le IN[BASH] Help! Besoin d'aide pour l'écriture d'un script ...
Plus de sujets relatifs à : Help pour un probleme de pointeurs en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR