Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1507 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1863425
Profil sup​primé
Posté le 19-03-2009 à 10:03:04  answer
 

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
mood
Publicité
Posté le 19-03-2009 à 10:03:04  profilanswer
 

n°1863430
Elmoricq
Modérateur
Posté le 19-03-2009 à 10:25:31  profilanswer
 

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

n°1863433
Profil sup​primé
Posté le 19-03-2009 à 10:35:12  answer
 

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
n°1863447
Profil sup​primé
Posté le 19-03-2009 à 11:05:55  answer
 

Oh putain [:mister yoda]
 

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


 
[:clooney16]

n°1863449
Elmoricq
Modérateur
Posté le 19-03-2009 à 11:08:27  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[Visual C#] Problème projet après changement de PCC, execution de sous programme [TERMINE]
Programme C avec interface webAffichage des champs d'une table [RESOLU]
[resolu]Tenir une requete?[Résolu] Limite le nombre d'éléments matchés
[RESOLU]isset d'un GET d'une checkboxProgrammation C - DSP - MATLAB => CCS
Probléme CSS[Résolu] Créer un fichier tableur en PHP (pas EXCEL)
Plus de sujets relatifs à : [résolu][C] Strlen - erreur de segmentation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR