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
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 !

2 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
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 :
#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
1
Merci beaucoup pour ton aide ! je vais essayer ça !
0
thotoss > thotoss
17 avril 2008 à 16:28
alors voila j'ai écris votre programme, qui marche a merveille .
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
0
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 567
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 ;-)

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;
}

0