Au secours!! Erreur de segmentation

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.
Configuration: Linux
Mozilla 1.8.1.6

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. 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 :-)
    1. 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;
      @+
      1. 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
        1. 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 ?
          1. oui,ce ca que je veux mais comme je suis debutant j'ai du mal l'info.
            1. Contributeur
              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,