problème type char* et char*[20]

problème type char* et char*[20] - C - Programmation

Marsh Posté le 11-05-2014 à 14:57:51    

Bonjour à tous,
 
Je suis débutant en programmation et je dois réaliser un projet mais une erreur intervient dans mon programme et je ne vois vraiment pas comment la résoudre.
Il s'agit d'un "livre-jeu" et pour charger une partie, j'ai utilisé un fichier préalablement crée sauf que dans mon fichier il y a une chaîne de caractères limitée à 20 caractères et donc quand je fais mon fscanf je mets donc %s mais lorsque je met l'opérateur &, il me dit "format %s expects argument of type 'char *' but argument 2 has type char (*)[20]" donc j'ai essayé d'enlever cette limite (que j'avais défini en constante) pour voir mais ça me sort un tas d'erreurs évidemment...
 
Voici mon code source :  

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. /****************************************************************************************************
  5.                                         Structures de donnees
  6. *****************************************************************************************************/
  7. #define MAX_NOM 20
  8. #define SAVE "save.txt"
  9. struct personnage
  10. {
  11.     char pseudo[MAX_NOM];
  12.     int habilete, endurance, chance;
  13. }personnage;
  14. typedef struct personnage sPerso;
  15. /****************************************************************************************************
  16.                                 Declaration des fonctions secondaires
  17. *****************************************************************************************************/
  18. int lance_de(); // renvoie le resultat de .. lance(s) de dé
  19. void creation_avatar(sPerso* p); // demande un pseudo et genere les attributs de l'avatar
  20. void afficher_avatar(sPerso p); // affiche les attributs de l'avatar cree precedemment
  21. void sauvegarder(sPerso p, char nomF[]); // ecrit dans un fichier le pseudo et les attributs du dernier avatar cree
  22. void charger(sPerso *p, char nomF[]); // lit dans un fichier le pseudo et les attributs du dernier avatar cree
  23. /****************************************************************************************************
  24.                                         Fonction principale
  25. *****************************************************************************************************/
  26. int main()
  27. {
  28. srand(time(NULL));
  29. sPerso p;
  30. printf("BIENVENUE!\n\n" );
  31. creation_avatar(&p);
  32. afficher_avatar(p);
  33. sauvegarder(p, SAVE);
  34. charger(&p, SAVE);
  35. afficher_avatar(p);
  36. return 0;
  37. }
  38. /****************************************************************************************************
  39.                                 Definition des fonctions secondaires
  40. *****************************************************************************************************/
  41. int lance_de()
  42. {
  43. int x=0;
  44. x=x+(rand()%6)+1;
  45. return x;
  46. }
  47. void creation_avatar(sPerso* p) /*Creation de l'avatar*/
  48. {
  49. printf("Veuillez saisir votre pseudo : " );
  50. scanf("%s", (*p).pseudo);
  51. (*p).habilete=(6 + lance_de());
  52. (*p).endurance=(12 + lance_de() + lance_de());
  53. (*p).chance=(6 + lance_de());
  54. }
  55. void afficher_avatar(sPerso p) /*Affiche le pseudo et les attributs de l'avatar*/
  56. {
  57. printf("\n" );
  58. printf("Votre pseudo est : %s\n", (p.pseudo));
  59. printf("Votre habilete est de : %d\n", ((p.habilete)));
  60. printf("Votre endurance est de : %d\n", ((p.endurance)));
  61. printf("Votre chance est de : %d\n", ((p.chance)));
  62. }
  63. void sauvegarder(sPerso p, char nomF[])
  64. {
  65.     FILE* fichier;
  66.     if ((fichier=fopen(SAVE, "w" )) == NULL)
  67.     {
  68.         fprintf(stderr, "\nEchec a l'ouverture du fichier %s (mode w)!\n", SAVE);
  69.         exit(0);
  70.     }
  71.     fprintf(fichier,"Votre pseudo est : %s\n",p.pseudo);
  72.     fprintf(fichier,"Votre habilete est de : %d\n",p.habilete);
  73.     fprintf(fichier,"Votre endurance est de : %d\n",p.endurance);
  74.     fprintf(fichier,"Votre chance est de : %d\n",p.chance);
  75.     fclose(fichier);
  76. }
  77. void charger(sPerso *p, char nomF[])
  78. {
  79.     FILE* fichier;
  80.     if ((fichier=fopen(SAVE, "r" )) == NULL)
  81.     {
  82.         fprintf(stderr, "\nEchec a l'ouverture du fichier %s (mode r)! \n", SAVE);
  83.         exit(0);
  84.     }
  85.     fscanf(fichier,"%s",&((*p).pseudo)); //c'est ici que vient l'erreur, et si j'enleve le &, ca m'affiche "Votre pseudo est  : Votre"
  86.     fscanf(fichier,"%d",&((*p).habilete));
  87.     fscanf(fichier,"%d",&((*p).endurance));
  88.     fscanf(fichier,"%d",&((*p).chance));
  89.     fclose(fichier);
  90. }


 
J'espère avoir été clair,
 
Merci d'avance.

Reply

Marsh Posté le 11-05-2014 à 14:57:51   

Reply

Marsh Posté le 12-05-2014 à 17:10:35    

Bonjour,
(*p).qqchose peut s'écrire p->qqchose (c'est plus lisible).
 
p->pseudo est déjà un pointeur (un tableau de 20 caractères est un pointeur)
dont tu n'as pas besoin de mettre & car p est déjà une adresse.
 
fscanf est un piège. La lecture s'arrête lorsqu'un espace est rencontré. Comme
tu écris "Votre pseudo est : %s\n" dans le fichier, il récupère "Votre".
 
Le mieux pour lire un fichier ligne par ligne est d'utiliser fgets.

Code :
  1. char *fgets(char *s, int size, FILE *stream);


 
ce qui donne quelque chose du genre:

Code :
  1. fgets(p->pseudo, MAX_NOM, fichier);


Attention, fgets stocke aussi le retour à la ligne dans le tableau, il faut
penser à le supprimer ensuite.
 
Par contre il faudrait ne stocker que le pseudo dans le fichier et non "Votre
pseudo est : %s\n"

Code :
  1. fprintf(fichier, "%s\n", p.pseudo);


 
Edit:
Pour transformer une chaine de caractères en nombre, par exemple pour récupérer
l'habileté et la stocker dans un int il existe strtol:

Code :
  1. char temp[50];
  2. fgets(temp, sizeof(temp), fichier); //on récupère la ligne
  3. p->habilete = strtol(temp, NULL, 10); //conversion en long int



Message édité par ptitchep le 12-05-2014 à 17:15:42

---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

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