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

  FORUM HardWare.fr
  Programmation

  [ C ] Fonction et char*

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ C ] Fonction et char*

n°178314
chaica
Posté le 18-07-2002 à 01:03:26  profilanswer
 

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

mood
Publicité
Posté le 18-07-2002 à 01:03:26  profilanswer
 

n°178319
smaragdus
whores, drugs & J.S. Bach
Posté le 18-07-2002 à 01:30:23  profilanswer
 

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
n°178324
chaica
Posté le 18-07-2002 à 01:50:49  profilanswer
 

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
n°178326
smaragdus
whores, drugs & J.S. Bach
Posté le 18-07-2002 à 02:04:56  profilanswer
 

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)

n°178327
chaica
Posté le 18-07-2002 à 02:10:56  profilanswer
 

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

n°178349
koulip31
Posté le 18-07-2002 à 08:20:31  profilanswer
 

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


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

  [ C ] Fonction et char*

 

Sujets relatifs
[opengl] probleme avec la fonction glcolor3d[PHP] Comment faire quand on a pas la fonction date('W')
[JS] faire 'attendre' le return d'une fonction[ACCESS] fonction date
la fonction mail () en local marche elle ?[PHP] Je vais devenir fou avec cette fonction addslashes
la fonction mail() est-elle desactivée sur Multimania ?[C++] Pointeur de fonction sur membre d'une classe
une fonction vbscript ne peut elle pas retourner un objet recordset??[PHP] savoir si une fonction existe
Plus de sujets relatifs à : [ C ] Fonction et char*


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