Problème d'allocation en langage C
clemou01
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis actuellement en projet sur le langage C, et cela fait quelques jours que je bloque sur une partie de mon code.
J'enregistre un "int race" grace à un scanf. Et je souhaiterai que ce int corresponde à un "char" comment est ce possible ?
exemple :
printf("Voici 3 races :");
printf(" [1] Archer");
printf(" [2] Druide");
scanf("%d", &race);
En gros je voudrais que la valeur de race corresponde à "Archer" dans un char "rrace" si race = 1 et à "Druide" si race = 2.
Pouvez vous m'aider ?
Je suis actuellement en projet sur le langage C, et cela fait quelques jours que je bloque sur une partie de mon code.
J'enregistre un "int race" grace à un scanf. Et je souhaiterai que ce int corresponde à un "char" comment est ce possible ?
exemple :
printf("Voici 3 races :");
printf(" [1] Archer");
printf(" [2] Druide");
scanf("%d", &race);
En gros je voudrais que la valeur de race corresponde à "Archer" dans un char "rrace" si race = 1 et à "Druide" si race = 2.
Pouvez vous m'aider ?
A voir également:
- Problème d'allocation en langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Allocation de rentrée scolaire en france - Guide
- Langage visual basic - Télécharger - Langages
4 réponses
Bonjour,
Pourquoi "problème d'allocation" ?
Dans un char rrace, c'est pas possible. Un char représente un caractère et un seul. Il faut donc un ensemble de caractère pour contenir "Archer" ou "Druide".
Pour ma part, je te propose un tableau.
Par exemple, char *trace[]={"Archer", "Druide"};
Ensuite, trace[race-1] contiendra la réponse que vous souhaitez.
Si vous voulez vraiment un simple char *rrace ou char rrace[MAX], tu peux utiliser strcpy.
Pourquoi "problème d'allocation" ?
Dans un char rrace, c'est pas possible. Un char représente un caractère et un seul. Il faut donc un ensemble de caractère pour contenir "Archer" ou "Druide".
Pour ma part, je te propose un tableau.
Par exemple, char *trace[]={"Archer", "Druide"};
Ensuite, trace[race-1] contiendra la réponse que vous souhaitez.
Si vous voulez vraiment un simple char *rrace ou char rrace[MAX], tu peux utiliser strcpy.
Si je comprend bien, tu pourrais te faire un tableau de correspondance.
Mon C est assez, je m'excuse si j'ai fait des erreurs.
char races[2][10];
races[0] = {'A','r','c','h','e','r',' ',' ',' ',' '}
races[1] = {'D','r','u','i','d','e',' ',' ',' ',' '}
Une fois que tu as ce tableau, races[race-1] te retourne le tableau de char.
Désolé, il faut que je me sauve mais c'est une piste.
Salut et bonne chance!
Echo "Lima Mike Alfa";
Mon C est assez, je m'excuse si j'ai fait des erreurs.
char races[2][10];
races[0] = {'A','r','c','h','e','r',' ',' ',' ',' '}
races[1] = {'D','r','u','i','d','e',' ',' ',' ',' '}
Une fois que tu as ce tableau, races[race-1] te retourne le tableau de char.
Désolé, il faut que je me sauve mais c'est une piste.
Salut et bonne chance!
Echo "Lima Mike Alfa";
si j' ai bien compris compris tu reflechit pas de la bonne facon pas besoin de transformer l'int en char mais juste une condition et en fonction tu remplis ta variable.
ex ;
int lec;
char buff[20];
char *race;
lec = read(0, buff, 20);
buff[lec - 1] = '\0';
race = malloc(strlen(buff) * sizeof(*race));
if (strcmp(buff, "1") == 0)
race = "druide";
else if (strcmp(buff, "2") == 0)
race = "archer";
Bon moi j'ai fait un read au lieu de scanf mais sa marche pareille
Sinon apres je te conseil d'utiliser les pointeur sur fonction pour eviter plein de else if.
J'espere t'avoir aider.
Salut
ex ;
int lec;
char buff[20];
char *race;
lec = read(0, buff, 20);
buff[lec - 1] = '\0';
race = malloc(strlen(buff) * sizeof(*race));
if (strcmp(buff, "1") == 0)
race = "druide";
else if (strcmp(buff, "2") == 0)
race = "archer";
Bon moi j'ai fait un read au lieu de scanf mais sa marche pareille
Sinon apres je te conseil d'utiliser les pointeur sur fonction pour eviter plein de else if.
J'espere t'avoir aider.
Salut
Bon moi j'ai fait un read au lieu de scanf mais sa marche pareille
Sauf que read est Posix et que scanf est complètement standard. Donc, c'est bien mieux d'utiliser scanf pour ne pas perdre en portabilité.
race = malloc(strlen(buff) * sizeof(*race));
Tu n'alloues pas la bonne quantité de mémoire. Il faut allouer strlen(buff)+1 pour stocker le caractère terminal.
if (strcmp(buff, "1") == 0)
Attention au \n qui sera stocké avec la fonction read. Il faut donc soit le virer avec strchr soit comparer avec "1\n", soit utiliser scanf...
race = "druide";
Horreur ^^. Tu perds l'allocation mémoire faite avec malloc. Ici tu dis que race pointe vers une zone comprenant "druide" en mémoire. Il faut utiliser strcpy pour remplir la zone allouée avec malloc. En C, on ne copie pas une chaîne de caractère avec l'opérateur =.
Sinon apres je te conseil d'utiliser les pointeur sur fonction pour eviter plein de else if.
Je ne vois pas en quoi un pointeur sur fonction va arrancher les choses. Un simple tableau de pointeur fera amplement l'affaire.
Cdlt,
Sauf que read est Posix et que scanf est complètement standard. Donc, c'est bien mieux d'utiliser scanf pour ne pas perdre en portabilité.
race = malloc(strlen(buff) * sizeof(*race));
Tu n'alloues pas la bonne quantité de mémoire. Il faut allouer strlen(buff)+1 pour stocker le caractère terminal.
if (strcmp(buff, "1") == 0)
Attention au \n qui sera stocké avec la fonction read. Il faut donc soit le virer avec strchr soit comparer avec "1\n", soit utiliser scanf...
race = "druide";
Horreur ^^. Tu perds l'allocation mémoire faite avec malloc. Ici tu dis que race pointe vers une zone comprenant "druide" en mémoire. Il faut utiliser strcpy pour remplir la zone allouée avec malloc. En C, on ne copie pas une chaîne de caractère avec l'opérateur =.
Sinon apres je te conseil d'utiliser les pointeur sur fonction pour eviter plein de else if.
Je ne vois pas en quoi un pointeur sur fonction va arrancher les choses. Un simple tableau de pointeur fera amplement l'affaire.
Cdlt,