lecture tableau texte 2D erreur de segmentation
4 participants
Page 1 sur 1
lecture tableau texte 2D erreur de segmentation
Bonjour,
Je n'arrive pas à faire tourner ce code.
Les données on la forme
fhkgg fhjjkkk hjjkkll
ghhj jjkk illll
jh ddddd fjkkll
colonnes séparées par un espace.
Merci d'avance pour votre aide.
Je n'arrive pas à faire tourner ce code.
- Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
main()
{
int i=1;
int j=1;
int k=0;
int ligne=0;
int colonne=0;
char *c=0;
char***mots;
char***motstmp;
int index=0;
i=(int)malloc(sizeof(int));
j=(int)malloc(sizeof(int));
k=(int)malloc(sizeof(int));
c=(char*)malloc(sizeof(char));
ligne=(int)malloc(sizeof(int));
colonne=(int)malloc(sizeof(int));
index=(int)malloc(sizeof(int));
mots=(char***)malloc(2*sizeof(char**));
FILE *fp=fopen("C:/Users/Invité/Desktop/tt.txt","r");
for(i=1;i<=1625;i++){
if(feof(fp)!=0)break;
*c=fgetc(fp);
printf("%c",c);
if (*c == '\n') {
// On est à la fin d'une ligne
++ligne;
colonne = 0;
}
else if (isspace(*c)) {
// On a lu un caractère d'espacement, donc on est à la fin d'un mot
++colonne;
index = 0;
}
else {
// On a lu un caractère normal, on le place à la fin de la chaîne temporaire
motstmp[ligne][colonne]=(char *) realloc(mots[ligne][colonne],(index + 2) * sizeof(char));
mots[ligne][colonne] = motstmp[ligne][colonne]; // Allocation de la mémoire nécessaire dans le tableau => ne pas oublier de désallouer en fin de programme !
sprintf(mots[ligne][colonne], "%s%c",mots[ligne][colonne],c);
strcat(
++index;
}
}
fclose(fp);
printf("%s",mots[5][2]);
printf("(%d",j);
printf("/%d)",k);
return 0;
}
Les données on la forme
fhkgg fhjjkkk hjjkkll
ghhj jjkk illll
jh ddddd fjkkll
colonnes séparées par un espace.
Merci d'avance pour votre aide.
Aurel- Messages : 1
Date d'inscription : 15/10/2011
Re: lecture tableau texte 2D erreur de segmentation
Bonjour.
Tout d'abord, les malloc que vous faites sur vos variables int ne servent pour ainsi dire à rien puisque un int à sa déclaration a déjà la taille d'un int.
Ensuite, dans printf("%c",c);, le c ayant été déclaré comme une chaîne de caractères, il faut soit changer %c par %s soit indiquer un caractère au lieu d'une chaîne (soit en faisant c[indice], soit en changeant le type de c (char au lieu de char*).
Plus tard dans le code, il y a un strcat ouvert, vide et qui n'est jamais fermé. Ce qui perturbe grandement la compilation du programme.
Cordialement,
Watchi~
Tout d'abord, les malloc que vous faites sur vos variables int ne servent pour ainsi dire à rien puisque un int à sa déclaration a déjà la taille d'un int.
Ensuite, dans printf("%c",c);, le c ayant été déclaré comme une chaîne de caractères, il faut soit changer %c par %s soit indiquer un caractère au lieu d'une chaîne (soit en faisant c[indice], soit en changeant le type de c (char au lieu de char*).
Plus tard dans le code, il y a un strcat ouvert, vide et qui n'est jamais fermé. Ce qui perturbe grandement la compilation du programme.
Cordialement,
Watchi~
watchinofoye- Messages : 6
Date d'inscription : 27/03/2013
Re: lecture tableau texte 2D erreur de segmentation
Bonsoir,
I) la fonction malloc sert à allouer de la mémoire et retourne un pointeur sur cet espace si la fonction à réussi.
soit tu fais :
soit tu fais :
II) Vérifies aussi le retour des fonctions que tu utilises afin d'éviter des soucis. (malloc, fopen, ...)
Repostes ton code avec les modifications et on verra pour la suite.
Matt...
I) la fonction malloc sert à allouer de la mémoire et retourne un pointeur sur cet espace si la fonction à réussi.
soit tu fais :
- Code:
int i = 0;
soit tu fais :
- Code:
int *i = NULL;
i = (int*)malloc(sizeof(int));
// Ton code
free(i);
i = NULL.
II) Vérifies aussi le retour des fonctions que tu utilises afin d'éviter des soucis. (malloc, fopen, ...)
Repostes ton code avec les modifications et on verra pour la suite.
Matt...
Re: lecture tableau texte 2D erreur de segmentation
Aurel a écrit:
Je n'arrive pas à faire tourner ce code. (-ed-)
Normal, il comporte de nombreuses erreurs ...
Je conseille de bien lire mes commentaires ...
- Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
/* -ed- ajoute' type retourne' ... */
{
int i=1;
int j=1;
int k=0;
int ligne=0;
int colonne=0;
char *c=0;
char***mots;
char***motstmp;
int index=0;
#if 0
i=(int)malloc(sizeof(int));
j=(int)malloc(sizeof(int));
k=(int)malloc(sizeof(int));
c=(char*)malloc(sizeof(char));
ligne=(int)malloc(sizeof(int));
colonne=(int)malloc(sizeof(int));
index=(int)malloc(sizeof(int));
mots=(char***)malloc(2*sizeof(char**));
/* -ed- tous ces casts sont inutiles malloc() retourne un void * compatible avec tous les types pointeur connus. */
#else
// correction :
i=malloc(sizeof(int));
j=malloc(sizeof(int));
k=malloc(sizeof(int));
c=malloc(sizeof(char));
ligne=malloc(sizeof(int));
colonne=malloc(sizeof(int));
index=malloc(sizeof(int));
mots=malloc(2*sizeof(char**));
/* -ed- qui fait apparaire de nombreuses erreurs ! Attention, un cast n'est pas un cache misere destine'
a faire taire les erreurs detectees par le compilateur ...
Il convient dans un premier temps de corriger ses erreurs, ce qui signifie les analyser et les comprendre.
Ici, il est clair que de vouloir mettre une reference (valeur retournee par malloc()) dans un entier
int i=1;
int j=1;
int k=0;
int ligne=0;
int colonne=0;
...
i=malloc(sizeof(int));
j=malloc(sizeof(int));
k=malloc(sizeof(int));
ligne=malloc(sizeof(int));
colonne=malloc(sizeof(int));
est une erreur de conception grave. Bien relire son cours sur l'allocation dynamique avant d'aborder la suite ...
*/
#endif
FILE *fp=fopen("C:/Users/Invité/Desktop/tt.txt","r");
for(i=1;i<=1625;i++){
if(feof(fp)!=0)break;
*c=fgetc(fp);
printf("%c",c);
if (*c == '\n') {
// On est à la fin d'une ligne
++ligne;
colonne = 0;
}
else if (isspace(*c)) {
// On a lu un caractère d'espacement, donc on est à la fin d'un mot
++colonne;
index = 0;
}
else {
// On a lu un caractère normal, on le place à la fin de la chaîne temporaire
motstmp[ligne][colonne]=(char *) realloc(mots[ligne][colonne],(index + 2) * sizeof(char));
/* -ed- le compilateur signale que 'motstmp' est utilise' alors qu'il n'a pas ete' initialise'. Gros bug ! */
mots[ligne][colonne] = motstmp[ligne][colonne]; // Allocation de la mémoire nécessaire dans le tableau => ne pas oublier de désallouer en fin de programme !
sprintf(mots[ligne][colonne], "%s%c",mots[ligne][colonne],c);
// strcat(
/* -ed- code incomplet */
++index;
}
}
fclose(fp);
printf("%s",mots[5][2]);
printf("(%d",j);
printf("/%d)",k);
return 0;
}
Sujets similaires
» message d'erreur en C
» Lire un texte de taille inconnue a partir de la STDIN
» probleme lors de la lecture d'un fichier
» Lire un texte de taille inconnue a partir de la STDIN
» probleme lors de la lecture d'un fichier
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum