Problème d'allocation en langage C

clemou01 -  
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 ?

A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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.
0
Doctor C Messages postés 627 Date d'inscription   Statut Membre Dernière intervention   399
 
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";
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Une fois de plus, je suis plus rapide ;-))).
Par contre, le tableau de pointeurs est moins lourd en mémoire et écrire "archer" au lieu de 'a', 'r','c' est moins pratique. Mais, je pense qu'effectivement l'idée du tableau 2D est la meilleure.
0
tuxzerty
 
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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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,
0
clemou01
 
ça marche en effet. Merci =)
0