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:
- Retourner un tableau en c
- Retourner ecran windows - Guide
- Tableau croisé dynamique - Guide
- Afficher un tableau en c - Forum C
- Tableau ascii - Guide
- Extraire des données d'un tableau excel vers un autre tableau ✓ - Forum Excel
2 réponses
mamiemando
Messages postés
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
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 566
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