[ C ] Fonction et char*

Fonction et char* [ C ] - Programmation

Marsh Posté le 18-07-2002 à 01:03:26    

Voila dans ce petit programme la saisie marche mais j'ai un segmentation fault ensuite. Ca doit être un truc à la ocn mais je ne le vois pas.
 Si vous avez quelques instants...
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. char* fonc_saisie()
  5. {
  6. char* saisie = (char*)malloc(30 * sizeof(char));
  7. int i;
  8. scanf("%s",saisie);
  9. while (saisie[i] != '\0')
  10. {
  11.  saisie[i] = tolower(saisie[i]);
  12.  i = i+1;
  13. }
  14. printf("Nouvelle chaine : %s",saisie);
  15. return saisie;
  16. free(saisie);
  17. ;
  18. }
  19. int main()
  20. {
  21.   struct machin{
  22.    char* nom;
  23.    char* prenom;
  24.   }mac;
  25.   mac.nom = (char*)malloc(30 * sizeof(char));
  26.   mac.prenom = (char*)malloc(30 * sizeof(char));
  27.   printf("\nentrer le nom\n" );
  28.   mac.nom = fonc_saisie();
  29.   printf("\nentrer le prenom\n" );
  30.   mac.prenom = fonc_saisie();
  31.   printf("\n%s %s\n",mac.nom,mac.prenom);
  32.   free(mac.nom);
  33.   free(mac.prenom);
  34.  return 0;
  35. }

 
 
Je fais une fonction parce qu'après je vais rendre la saisie plus restrictive.
 
CHaiCA

Reply

Marsh Posté le 18-07-2002 à 01:03:26   

Reply

Marsh Posté le 18-07-2002 à 01:30:23    

Euh là y a une double erreur, je pense :
 
     return saisie;
     free(saisie);
 
* un return provoque le retour direct donc le free n'est jamais executé
* Il ne faut pas libérer la zone mémoire si tu la retournes, malheureux :D
* tu reserves l'espace dans la structure puis tu la reserves dans la fonction => c'est pas logique => tu fais 2 fois un free sur un pointeur d'où la fameuse "segmentation fault"  ;)  
* aucune vérif sur la taille des chaines (mais ça tu comptes peut être l'ajouter plus tard) => "spabien"  
 
(Je corrige de tête, j'ai pas de compilo sous la main)
 

Code :
  1. char* fonc_saisie(char* chaineReservee)
  2. {
  3.     scanf("%s",chaineReservee);
  4.     char* ptr = chaineReservee;
  5.     while(*ptr != 0) {
  6.        *ptr = tolower(*ptr);
  7.        ptr++;
  8.     }
  9.     printf("Nouvelle chaine : %s",chaineReservee);
  10.     return chaineReservee; // même pas utile en fait
  11. }
  12. // le reste est ok sauf pour chaque appel à fonc_saisie :
  13.   printf("\nentrez le nom\n" );
  14.   fonc_saisie(mac.nom);


 
Ok ?


Message édité par smaragdus le 18-07-2002 à 02:02:24
Reply

Marsh Posté le 18-07-2002 à 01:50:49    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. int fonc_saisie(char* saisie)
  5. {
  6. int i;
  7. scanf("%s",saisie);
  8. while (saisie[i] != '\0')
  9. {
  10.  saisie[i] = tolower(saisie[i]);
  11.  i = i+1;
  12. }
  13. printf("Nouvelle chaine : %s",saisie);
  14. return 0;
  15. ;
  16. }
  17. int main()
  18. {
  19.   struct machin{
  20.    char* nom;
  21.    char* prenom;
  22.   }mac;
  23.   mac.nom = (char*)malloc(30 * sizeof(char));
  24.   mac.prenom = (char*)malloc(30 * sizeof(char));
  25.   printf("\nentrer le nom\n" );
  26.   fonc_saisie(mac.nom);
  27.   printf("\nentrer le prenom\n" );
  28.   fonc_saisie(mac.prenom);
  29.   printf("\n%s %s\n",mac.nom,mac.prenom);
  30.   free(mac.nom);
  31.   free(mac.prenom);
  32.  return 0;
  33. }

 
 
Voila la nouvelle versionmais elle ne marche pas plus pour l'instant
 
CHaiCA


Message édité par chaica le 18-07-2002 à 01:51:50
Reply

Marsh Posté le 18-07-2002 à 02:04:56    

Si tu avais utilisé :
 

Code :
  1. char* ptr = chaineReservee;
  2.         while(*ptr != 0) {
  3.              *ptr = tolower(*ptr);
  4.              ptr++;
  5.         }


 
ça marcherait sans problème :D  
(en plus c'est plus rapide : il y a 2 additions et une affectation en moins)

Reply

Marsh Posté le 18-07-2002 à 02:10:56    

Nan c'est bon ca marche très ben ta première réponse était tip top, merci de m'avoir aidé à une heure si tardive et @ la prochaine question!
 
CHaiCA

Reply

Marsh Posté le 18-07-2002 à 08:20:31    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. int fonc_saisie(char* saisie)
  5. {
  6. int i;
  7. scanf("%s",saisie);
  8.        i= 0;  
  9. while (saisie[i] != '\0')
  10. {
  11.  saisie[i] = tolower(saisie[i]);
  12.  i = i+1;
  13. }
  14. printf("Nouvelle chaine : %s",saisie);
  15. return 0;
  16. ;
  17. }
  18. int main()
  19. {
  20.   struct machin{
  21.    char* nom;
  22.    char* prenom;
  23.   }mac;
  24.   mac.nom = (char*)malloc(30 * sizeof(char));
  25.   mac.prenom = (char*)malloc(30 * sizeof(char));
  26.   printf("\nentrer le nom\n" );
  27.   fonc_saisie(mac.nom);
  28.   printf("\nentrer le prenom\n" );
  29.   fonc_saisie(mac.prenom);
  30.   printf("\n%s %s\n",mac.nom,mac.prenom);
  31.   free(mac.nom);
  32.   free(mac.prenom);
  33.  return 0;
  34. }

 
 
tu oublie l'init du i c pour ca

Reply

Sujets relatifs:

Leave a Replay

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