Exercice allocation dynamique

Fermé
memel - 6 juin 2015 à 18:50
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 juin 2015 à 16:57
bonjour voici l'enoncé

1)Lire 10 phrases au clavier et mémoriser les phrases en utilisant un tableau de pointeurs sur des chaînes de caractères:
  • Besoin déterministe connu dès le départ: un buffer de sasie de taille BUFSIZ
  • Besoin déterministe connu dès le départ: le nombre de phrases
  • Besoin non déterministe connu pendant l'exécution: la longueur des phrases (allocation

dynamique)
2) Libérer la mémoire allouée dynamiquement.

et voici mon code

void ex6()
{
int i;
int n;
char* tab;

tab = (char*)malloc( 10 * sizeof(char) );

for ( i=0; i<10; i++ )
{
printf("Phrase %d : ", i);
scanf("%c", &tab[i]);
}

for (n=0;n<i;n++)
printf("%c\n",tab[n]);
}

Lors de la demande de saisie, cela commence par "phrase 0 : ", si je rentre le caractère a,b,c,d (par exemple) il va directement passer a la demande de saisie de la phrase 2, sans passer par la 1. Je ne comprend pas trop.. Help ? merci. De plus comment libérer la mémoire alloué dynamiquement ?? avec Free ?



2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
6 juin 2015 à 21:43
Bonjour,

Déjà, tu n'utilises pas BUFSIZE...

void ex6()
Il faut à minima, une fonction main().
Donc mets plutôt :
int main(void)

Et n'oublie pas de rajouter :
return 0;
en fin de main().

char* tab;
C'est un pointeur. L'énoncé parle de tableau de pointeur. Donc plutôt :
char *tab[10];


tab = (char*)malloc( 10 * sizeof(char) );
Ce n'est pas ce qui est demandé. Donc à supprimer.

Il manque la déclaration d'un buffer. Par exemple :
char buffer[...];
(à toi de remplacer les ... par ce qu'il faut).

scanf("%c", &tab[i]);
Cela permet la saisie d'un caractère, pas d'une chaîne de caractères. Il faut plutôt mettre :
scanf("%s", buffer);


Ensuite, il faut recopier allouer tab[i] avec le nombre de caractères de buffer +1 (pour le '\0'). Pour compter le nombre de caractères, tu as la fonction strlen(). Après, il faudra recopier la chaîne buffer dans tab[i]. Pour cela, tu as la fonction strcpy() (ou strncpy() pour sa version sécurisée).

for (n=0;n<i;n++)
Pourquoi n<i ? Mets plutôt : n<10; ça revient au même, mais c'est plus parlant. D'ailleurs, tu peux même réutiliser i.

Pour libérer la mémoire, il faut utiliser la fonction free(); Par exemple :
free(tab[i]);
. N'oublie pas de faire une boucle for().

Bon courage,

Cdlt,
0
void ex6()
{
int i;
int n;
char *tab[10];
char buffer[(-> nombre de caractere pour chaque fois a calculer avec strlen )];
int x;



for ( i=0; i<10; i++ )
{
printf("Phrase %d : ", i);
scanf("%s", buffer);
x=strlen(buffer);
printf("%d\n",x);
}


for (n=0;n<10;n++)
printf("%s\n",buffer);
//Boucle a faire
//free(tab[i]);
}

int main(int argc, const char * argv[]) {

//exo11();
//exo12();
//exo13();
//exo2();
//exo5();
ex6();
return 0;
}
Le code n'est pas fini, mais j'en suis arrivé la !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
7 juin 2015 à 16:57
char buffer[(-> nombre de caractere pour chaque fois a calculer avec strlen )];
Non. buffer a une taille fixe. Relis ton énoncé ;-).
D'ailleurs, tu as oublié de mettre au début :
#define BUFSIZ 128
(tu mets la taille que tu veux).

x=strlen(buffer);
printf("%d\n",x);

À la place du printf(), il faudrait plutôt recopier la taille dans le tableau. Pour cela, il faut utiliser strcpy()/strncpy(). cf. post précédent.

for (n=0;n<10;n++)
printf("%s\n",buffer);

Dommage de laisser n comme choix de variable... Sinon printf(..., buffer) n'est pas bon. Il faut afficher les phrases stockées dans le tableau.

//Boucle a faire
//free(tab[i]);

Oui, il faut fairre ;-).

Cdlt,
0