Au secours!! Erreur de segmentation
Sabola
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je suis debutant en info et je progrmme sous unix.J'ai un exercice qui me demande d'ouvrir un fichier texte,de lire son contenue et d'afficher la chaine de caractères contenue entre la position courante dans le fichier et le premier espace ou saut de ligne.
Voici mon code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main( int argc,char* argv[])
{
char c; char mot[250];
char nomfich[20];
int i;
FILE*f1;
printf("donne le nom du fichier:\n");
scanf("%s",&nomfich);
f1=fopen(nomfich,"r");
if(f1=NULL)
{ printf("erreur d'ouverture");
}
i=0;
while(c=fgetc(f1)!=EOF)
{
if(c!=' ' && c!='\n')
{ mot[i]=c;
i++;
}
printf("%s\n",mot[i]);
mot[i]=0;
}
fclose(f1);
return EXIT_SUCCESS;
}
Mais quand je le compile et je l'execute il me donne une erreur de segmentation.je sais pas qu'est ce qui est à l'origine de ca.
Je ne sias si le code est bon ou pas.
J'ai utilisé le gdb pour chercher l'erreur j'ai ce message:
Program received signal SIGSEGV, Segmentation fault.
0xb7e0850d in getc () from /lib/libc.so.6
(gdb) bt
#0 0xb7e0850d in getc () from /lib/libc.so.6
#1 0x08048545 in main () at mot.c:26
mais je n'arrive pas a corriger l'erreur.Merci de votre aide.
je suis debutant en info et je progrmme sous unix.J'ai un exercice qui me demande d'ouvrir un fichier texte,de lire son contenue et d'afficher la chaine de caractères contenue entre la position courante dans le fichier et le premier espace ou saut de ligne.
Voici mon code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main( int argc,char* argv[])
{
char c; char mot[250];
char nomfich[20];
int i;
FILE*f1;
printf("donne le nom du fichier:\n");
scanf("%s",&nomfich);
f1=fopen(nomfich,"r");
if(f1=NULL)
{ printf("erreur d'ouverture");
}
i=0;
while(c=fgetc(f1)!=EOF)
{
if(c!=' ' && c!='\n')
{ mot[i]=c;
i++;
}
printf("%s\n",mot[i]);
mot[i]=0;
}
fclose(f1);
return EXIT_SUCCESS;
}
Mais quand je le compile et je l'execute il me donne une erreur de segmentation.je sais pas qu'est ce qui est à l'origine de ca.
Je ne sias si le code est bon ou pas.
J'ai utilisé le gdb pour chercher l'erreur j'ai ce message:
Program received signal SIGSEGV, Segmentation fault.
0xb7e0850d in getc () from /lib/libc.so.6
(gdb) bt
#0 0xb7e0850d in getc () from /lib/libc.so.6
#1 0x08048545 in main () at mot.c:26
mais je n'arrive pas a corriger l'erreur.Merci de votre aide.
A voir également:
- Au secours!! Erreur de segmentation
- Erreur upes 1025 - Forum Téléviseurs
- Erreur t32 ✓ - Forum Livebox
- Une erreur s'est produite instagram ✓ - Forum Instagram
- Erreur au lancement du player vidéo upes 197 ✓ - Forum Lecteurs et supports vidéo
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
7 réponses
salut
je me suis arrêté à la première erreur vue. le test ne doit pas être if(f1=NULL) mais if(f1==NULL)
la 1ere syntaxe attribue NULL à f1 :-)
je me suis arrêté à la première erreur vue. le test ne doit pas être if(f1=NULL) mais if(f1==NULL)
la 1ere syntaxe attribue NULL à f1 :-)
Salut,
printf("donne le nom du fichier:\n");
scanf("%s",nomfich);
printf("%s\n",&mot[i]);//mais je pense c'est printf("%c\n",mot[i]);
mot[i]=0;
@+
printf("donne le nom du fichier:\n");
scanf("%s",nomfich);
printf("%s\n",&mot[i]);//mais je pense c'est printf("%c\n",mot[i]);
mot[i]=0;
@+
Merci,mais maintenant ca compile et me donne :donne le nom du fichier:
donne le nom de fichier:
epi1.txt
(null)
(null)
(null)
(null)
(null)
(null)
Erreur de segmentation
je ne vois qu'est- ce que ne va pas
donne le nom de fichier:
epi1.txt
(null)
(null)
(null)
(null)
(null)
(null)
Erreur de segmentation
je ne vois qu'est- ce que ne va pas
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
printf("%s\n",&mot[i]);//mais je pense c'est printf("%c\n",mot[i]);
la première est fausse, non ? c'est plutot printf("%s\n",mot) à la limite.
En fait ,que veux tu faire à cet endroit, monsieur le posteur du sujet ? Afficher chaque caractère lu ? Tu ne veux pas plutot afficher simplement le mot à la fin ?
la première est fausse, non ? c'est plutot printf("%s\n",mot) à la limite.
En fait ,que veux tu faire à cet endroit, monsieur le posteur du sujet ? Afficher chaque caractère lu ? Tu ne veux pas plutot afficher simplement le mot à la fin ?
Salut,
Plusieurs erreurs :
scanf("%s",&nomfich); => scanf("%s",nomfich); : pas besoin d'esperluette
if(f1=NULL) => if(f1==NULL) : l'opérateur de comparaison est le double égal
while(c=fgetc(f1)!=EOF) => while((c=fgetc(f1))!=EOF) : usage de parenthèse autour de c=fgetc...
printf("%s\n",mot[i]); => printf("%c\n",mot[i]); : mot[i] est un char non de type char*
Attention : mot[i]=0;, tu devrais le mettre dans else car là, dans tous les cas tu récris 0. Enfin tout dépend de ce que tu souhaites faire. Ensuite, attention le code ascii 0 dans un char* est aussi le caractère de fin d'une chaîne de caractère. Donc choisis plutôt autre chose, à moins de savoir ce que tu fais...
Et enfin, tu réserves un tableau de 250 caractères, mais tu fais une boucle sans t'assurer que i est bien inférieur strictement à 248. Donc, ton programme va parcourir tout ton fichier et au-delà tu 249 caractères, cela récriera en dehors du tableau en remontant le long de la pile jusqu'à provoquer une erreur de segmentation.
Corrige toutes ces erreurs, et ça devrait aller mieux.
Cdlt,
Plusieurs erreurs :
scanf("%s",&nomfich); => scanf("%s",nomfich); : pas besoin d'esperluette
if(f1=NULL) => if(f1==NULL) : l'opérateur de comparaison est le double égal
while(c=fgetc(f1)!=EOF) => while((c=fgetc(f1))!=EOF) : usage de parenthèse autour de c=fgetc...
printf("%s\n",mot[i]); => printf("%c\n",mot[i]); : mot[i] est un char non de type char*
Attention : mot[i]=0;, tu devrais le mettre dans else car là, dans tous les cas tu récris 0. Enfin tout dépend de ce que tu souhaites faire. Ensuite, attention le code ascii 0 dans un char* est aussi le caractère de fin d'une chaîne de caractère. Donc choisis plutôt autre chose, à moins de savoir ce que tu fais...
Et enfin, tu réserves un tableau de 250 caractères, mais tu fais une boucle sans t'assurer que i est bien inférieur strictement à 248. Donc, ton programme va parcourir tout ton fichier et au-delà tu 249 caractères, cela récriera en dehors du tableau en remontant le long de la pile jusqu'à provoquer une erreur de segmentation.
Corrige toutes ces erreurs, et ça devrait aller mieux.
Cdlt,