[résolu][C] Strlen - erreur de segmentation

Strlen - erreur de segmentation [résolu][C] - C - Programmation

Marsh Posté le 19-03-2009 à 10:03:04    

Salut,
 
Je débute en C (et en programmation tout court) donc soyez indulgents.  
 
Je cherche à lire ce fichier: http://abiboom.snv.jussieu.fr/Linf [...] C_IlvI.adn
La première ligne est le commentaire com et le reste une séquence nucléotidique seq. Je souhaite obtenir la longueur en nucléotides de cette séquence.
 
J'ai donc pondu le code suivant:
 

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. typedef struct{
  4. char com[101];
  5. char seq[10001];
  6. int lg;
  7. } Sequence;
  8. Sequence LitFasta(char nom[]){
  9. Sequence s;
  10. FILE * fi;
  11. char tmpseq[82];
  12. fi=fopen(nom,"r" );
  13. if(fi!=NULL)
  14. {
  15.  s.seq[0]='\0';
  16.  fgets(s.com,81,fi);
  17. while(fgets(tmpseq,81,fi)!=NULL)
  18. {
  19.  tmpseq[strlen(tmpseq)-1]='\0';
  20.  strcat(s.seq,tmpseq);
  21. }
  22.  fclose(fi);
  23. }
  24. s.lg=strlen(s.seq);
  25. return s;
  26. }
  27. int main()
  28. {
  29. char NomFich[101];
  30. Sequence adn;
  31. printf("Nom du fichier? \n" );
  32. scanf("%s",NomFich);
  33. adn=LitFasta(NomFich);
  34. printf("%s \n",adn.com);
  35.         printf("%s \n",adn.seq);
  36. printf("%s \n",adn.lg);
  37. return 0;
  38. }


 
Apparemment ça bloque à la ligne 31:
s.lg=strlen(s.seq);
La séquence s'affiche correctement et je ne vois pas pourquoi l'exécutable (ça compile correctement) me renvoit un segmentation fault. Si vous avez une idée...


Message édité par Profil supprimé le 19-03-2009 à 11:06:19
Reply

Marsh Posté le 19-03-2009 à 10:03:04   

Reply

Marsh Posté le 19-03-2009 à 10:25:31    

Tu empiles n * 81 caractères dans seq. Il faut que tu ajoutes un contrôle pour t'assurer que la somme des tailles ajoutées ne dépasse pas la capacité maximum de seq.
 
De plus, cette ligne-ci ne sert à rien :
tmpseq[strlen(tmpseq)-1]='\0';
 
Pour deux raisons :
1. strlen() retourne la taille d'un tableau de char en comptant le nombre de char jusqu'à trouver un '\0'. Donc, utiliser strlen() sur une chaîne pour ajouter un '\0' mène forcément à une catastrophe. :)
2. fgets() ajoute de toute façon un '\0' en fin de chaîne, tu es donc tranquille de ce côté-là.

Reply

Marsh Posté le 19-03-2009 à 10:35:12    

Le problème est qu'il y a des sauts de ligne dans le fichier contenant la séquence et ces sauts ne doivent pas être comptabilisés dans le compte final du nombre de caractères de cette séquence.  
 
Enfin merci je vais méditer sur le reste de tes conseils :o :jap:


Message édité par Profil supprimé le 19-03-2009 à 10:50:04
Reply

Marsh Posté le 19-03-2009 à 11:05:55    

Oh putain [:mister yoda]
 

Code :
  1. printf("%s \n",adn.lg);


 
[:clooney16]

Reply

Marsh Posté le 19-03-2009 à 11:08:27    

Aussi ouais, je n'avais pas fait attention. [:dawa]
 
De plus, évite scanf(). Utilise fgets(), beaucoup plus simple d'utilisation (scanf est vraiment pas une fonction simple à utiliser correctement).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed