Au secours!! Erreur de segmentation

Sabola -  
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.

7 réponses

fiu
 
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 :-)
0
chuka Messages postés 980 Statut Membre 378
 
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;
@+
0
sabola Messages postés 10 Statut Membre
 
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
0
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
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 ?
0
sabola Messages postés 10 Statut Membre
 
oui,ce ca que je veux mais comme je suis debutant j'ai du mal l'info.
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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,
0