Problème d'allocation en langage C

Fermé
clemou01 - 30 nov. 2010 à 22:20
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 déc. 2010 à 08:45
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 ?

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
30 nov. 2010 à 22:36
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 mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
Modifié par Doctor C le 30/11/2010 à 22:41
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 30/11/2010 à 23:05
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
1 déc. 2010 à 08:45
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
ça marche en effet. Merci =)
0