Exercice allocation dynamique

memel -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  2. memel
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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