Retourner un tableau de caractére en C
thotoss
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour,
je voudrais faire une fonction qui me demande des noms, qui loge ces noms dans un tableau prévu, et qui renvoi ce tableau pour que je puisse m'en servir dans la suite de mon programme . Alors voila ce que j'ai fais :
char nom_joueurs(int nbr)
{
int i;
char tab_nom[nbr];
char * ad = &tab_nom[0];
for (i=0;i<nbr;i++)
{
printf("Joueur %d, entrez votre nom :\n", i+1);
scanf("%s",&ad);
ad++;
}
return tab_nom[nbr];
}
Voila. Cependant elle ne marche pas, car si par exemple j'ai 2 joueurs (nbr=2), il me demande bien le nom du joueur 1, qu'il garde bien, mais pour le nom du joueur 2, si il fait 4 lettres,il me le redemande jusqu'a qu'il ne fasse pas 4 lettres ( par contre si il ne fait pas 4 lettres, tout roule ) ... bizar nan ?? !! :p
donc voila si vous pouvez m'adier a éclaircir ce mystere
merci !
je voudrais faire une fonction qui me demande des noms, qui loge ces noms dans un tableau prévu, et qui renvoi ce tableau pour que je puisse m'en servir dans la suite de mon programme . Alors voila ce que j'ai fais :
char nom_joueurs(int nbr)
{
int i;
char tab_nom[nbr];
char * ad = &tab_nom[0];
for (i=0;i<nbr;i++)
{
printf("Joueur %d, entrez votre nom :\n", i+1);
scanf("%s",&ad);
ad++;
}
return tab_nom[nbr];
}
Voila. Cependant elle ne marche pas, car si par exemple j'ai 2 joueurs (nbr=2), il me demande bien le nom du joueur 1, qu'il garde bien, mais pour le nom du joueur 2, si il fait 4 lettres,il me le redemande jusqu'a qu'il ne fasse pas 4 lettres ( par contre si il ne fait pas 4 lettres, tout roule ) ... bizar nan ?? !! :p
donc voila si vous pouvez m'adier a éclaircir ce mystere
merci !
A voir également:
- Return tableau c
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer tableau excel sur une page - Guide
2 réponses
Bon en fait ça ne peut pas marcher car une chaîne est un tableau de caractère (char *), donc un tableau de chaîne de caractère est un char **. Comme tu ne sais pas combien de joueurs (nbr) devront être créés avant l'exécution, tu ne peux pas faire une allocation statique ça ne compilera pas (il faut faire un malloc) pour allouer la mémoire dynamiquement. Et qui dit malloc dit free à la fin.
Voici une manière de faire :
Ce qui donne :
Note : le programme est beaucoup plus facile à écrire en C++ en utilisant les classes std::vector et std::string.
Bonne chance
Voici une manière de faire :
#include <stdio.h> #include <stdlib.h> #include <string.h> char **lire_noms_joueurs(unsigned nbr){ char buffer[255]; char **noms = (char **)malloc(sizeof(char*)*nbr); unsigned i,len; printf("il y aura %i joueurs, saisissez leurs noms\n",nbr); for(i=0;i<nbr;++i){ printf("nom du joueur %i ?\n",i+1); scanf("%s",buffer); len = strlen(buffer); noms[i] = (char *)malloc(sizeof(char)*(len+1)); strcpy(noms[i],buffer); } return noms; } void afficher_noms_joueurs(char **noms,unsigned nbr){ unsigned i; printf("les joueurs sont :\n"); for(i=0;i<nbr;++i) printf("%s\n",noms[i]); } void supprimer_noms_joueurs(char **noms,unsigned nbr){ unsigned i; for(i=0;i<nbr;++i) free(noms[i]); free(noms); } int main(){ unsigned nbr; char **noms; printf("nombre de joueurs ?\n"); scanf("%i",&nbr); noms = lire_noms_joueurs(nbr); afficher_noms_joueurs(noms,nbr); supprimer_noms_joueurs(noms,nbr); // getchar(); // si tu es sous windows décommente cette instruction return 0; }
Ce qui donne :
nombre de joueurs ? 3 il y aura 3 joueurs, saisissez leurs noms nom du joueur 1 ? asterix nom du joueur 2 ? thorgal nom du joueur 3 ? tintin les joueurs sont : asterix thorgal tintin
Note : le programme est beaucoup plus facile à écrire en C++ en utilisant les classes std::vector et std::string.
Bonne chance
Salut,
tu n'as pas besoin de rajouter quoi que ce soit après getchar()
il y a la fonction afficher_noms_joueurs qui fait ça
en plus après l'affichage la mémoire est libérée par la fonction supprimer_noms_joueurs d'où ton résultat bizarre ;-)
tu n'as pas besoin de rajouter quoi que ce soit après getchar()
il y a la fonction afficher_noms_joueurs qui fait ça
en plus après l'affichage la mémoire est libérée par la fonction supprimer_noms_joueurs d'où ton résultat bizarre ;-)
int main(){ unsigned nbr; char **noms; printf("nombre de joueurs ?\n"); scanf("%i",&nbr); noms = lire_noms_joueurs(nbr); afficher_noms_joueurs(noms,nbr); // affichage supprimer_noms_joueurs(noms,nbr); // mémoire libérée getchar(); return 0; }
Maintenant j'ai rajouté ça, aprés le getchar() (je travaille sous windows) et j'ai enlevé le return 0.
J'ai ajouté :
for (i=0;i<nbr;i++)
{
printf(" Au tour de %s de jouer :\n",noms[i]);
...
...
...
}
et la il ne m'affiches pas le nom du joueur a la place du %s, mais des caractéres qui n'ont rien a voir. Ou est l'erreur ?
merci de m'aider