Retourner un tableau de caractére en C
Fermé
thotoss
-
16 avril 2008 à 18:52
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 17 avril 2008 à 16:38
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 17 avril 2008 à 16:38
A voir également:
- Return tableau c
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
2 réponses
mamiemando
Messages postés
33407
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
29 novembre 2024
7 806
17 avril 2008 à 00:06
17 avril 2008 à 00:06
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
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
17 avril 2008 à 16:38
17 avril 2008 à 16:38
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; }
17 avril 2008 à 16:02
17 avril 2008 à 16:28
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