IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Allocation dynamique d'un tableau char
Options
PapouMAC
posté 30 Dec 2014, 12:48
Message #1


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 336
Inscrit : 25 Sep 2004
Lieu : Occitanie
Membre no 24 178



Bonjour

J'en suis à l'allocation dynamique d'un tableau, mais j'ai un petit soucis qui est le suivant :

Je rentre le nombre d'amis (ex : 2), puis leur âge et ensuite leur nom jusque là tout va bien, mais c'est lors de l'affichage que ça coince.

Exemple :

amis n°1 : âge 18, nom : Pierre;
amis n° 2 : âge 20, nom : Alain,

A l'affichage j'obtiens :

PAlain est né en....
Alain est né en ....

Comment fait-on pour allouer de la mémoire pour la longueur du nom ?

Car je pense que c'est à ce niveau là qu'il a un problème.

Merci.

Je précise que je débute en C et que ceci est un exemple de programmation pour appréhender l'allocation dynamique.

Code
         #include <stdio.h>
         #include <stdlib.h>
        
         int main(int argc, const char * argv[])
         {
             int nombreAmis = 0, i = 0;
             int *ageAmis = NULL;
             char *nomAmis = NULL;
            
             printf("Combien d'amis avez-vous ? ");
             scanf("%d", &nombreAmis);
            
             if (nombreAmis > 0)
             {
                 ageAmis = malloc(nombreAmis *sizeof(int));
                 nomAmis = malloc(nombreAmis *sizeof(int));
                
                 if (ageAmis == NULL)
                 {
                     exit(0);
                 }
                 for (i = 0; i < nombreAmis; i++)
                 {
                     printf("Quel âge à l'ami numéro %d ? ", i + 1);
                     scanf("%d", &ageAmis[i]);
                     printf("Quel est son nom  ? ");
                     scanf("%s", &nomAmis[i]);
                    
                 }
                 printf("\n\nDates de naissance de vos amis :\n");
                 for (i = 0; i < nombreAmis; i++)
                 {
                     printf("%s est n(é) en %d\n", &nomAmis[i], 2014 - ageAmis[i]);
                 }
                 free(ageAmis);
                 free(nomAmis);
             }
             return 0;
            
         }


--------------------
MAC PRO 2009 (MAC OS 10.14.6) 2 x 3,33 Ghz 6-CoreIntel Xeon(5.1), , 64 Go.Carte graphique NVIDIA GeForce GTX 680.

Mac Studio M2 Max, 32Go, 1To
Go to the top of the page
 
+Quote Post
schlum
posté 30 Dec 2014, 15:56
Message #2


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 449
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



nomAmis doit être un char **

son allocation doit être un malloc(nombreAmis * sizeof(char*))

Ensuite, chaque élément du tableau doit lui même être alloué avec un malloc(taillMax * sizeof(char))

Il ne faut jamais faire un scanf("%s") car c’est un excellent moyen d’offrir un buffer overflow ; il faut fournir la taille maximale : scanf("%1024s") par exemple.


J’ai bien peur en voyant ce code que les tableaux, censés être maîtrisés nettement avant l’allocation dynamique, ne le soient pas.


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
mpergand
posté 30 Dec 2014, 16:24
Message #3


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



Salut,

Il te faut allouer un tableau de pointeurs:

char **nomAmis = malloc(nombreAmis *sizeof(char*));

ensuite, il faudra allouer une chaine pour le nom de chaque ami et l'affecter à un élément du tableau:

Code
// dans la boucle d'amis

char* nom=malloc(40+1); // longueur 40 caracteres max + zéro terminal
scanf("%40s",nom);  // limite la saisie à 40 cars
nomAmis[i]=nom;


à la fin faire un free sur tous les éléments du tableau et enfin sur le tableau lui-même (nomAmis)

Une solution alternative serait d'utiliser un pointeur sur un tableau de chars:
char (*nomAmis)[41]=malloc(41*nombreAmis);

ici, il n'y a pas d'allocation à faire, l'espace est déjà réservé pour chaque nom:
scanf("%40s",nomAmis[i]);

Go to the top of the page
 
+Quote Post
PapouMAC
posté 30 Dec 2014, 16:38
Message #4


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 336
Inscrit : 25 Sep 2004
Lieu : Occitanie
Membre no 24 178



Je vous remercie pour toutes ces précisions. Je vois donc que j'ai encore pas mal de boulot à faire avant de maitriser le C.


--------------------
MAC PRO 2009 (MAC OS 10.14.6) 2 x 3,33 Ghz 6-CoreIntel Xeon(5.1), , 64 Go.Carte graphique NVIDIA GeForce GTX 680.

Mac Studio M2 Max, 32Go, 1To
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 18th April 2024 - 22:10