Tableaux - Gestion dynamique de la mémoire [Résolu]

Messages postés
10
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 avril 2010
- - Dernière réponse : Smanyx
Messages postés
10
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 avril 2010
- 14 avril 2010 à 05:46
Salut !

Je voudrais écrire un programme qui accepte des noms saisis au clavier et les amasse dans un tableau. Comme les noms sont entrés dans un boucle, la taille du tableau n'est pas connu en avance et doit donc être gérée dynamiquement.

voici le code que j'ai à l' instant et qui ne tourne pas. Votre aide est vraiment la bienvenue.
Merci.

Smanyx

#include <stdio.h>
#include <stdlib.h>

int main ()
{
int i = 0;
char Noms[][25];

puts("\nPour terminer, tapez EOF (Ctrl + Z) ");
             Noms = (char *) malloc(1 * sizeof(char));
do
{
printf("\nVeuillez entrer un nom svp: ");
gets(Noms[i]);
i++;
Noms = (char *) realloc (Noms, i * sizeof (char));
printf("\nVeuillez entrer un nom svp: ");
}while(!feof(stdin));

printf ("Liste de noms saisis: ");
    for (int n = 0; n<i; n++) 
{
printf ("%s ",Noms[n]);
}
    free (Noms);

getchar();
return 0;
}
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
9
3
Merci
Salut,

Heu... Je vois une vague logique dans ton code, par contre je ne comprends pas grand chose à tes tailles d'allocation notamment. Par exemple le premier malloc qui alloue un caractère, j'ai du mal. Et la déclaration du tableau me paraît aussi plutôt originale.

A part ça, il est souvent conseillé de coder tout en anglais (Par exemple pour ne pas avoir de problème d'accents). Et perso je préfère indenter à coup de deux espaces. Les tabs ça supporte mal les passages d'un éditeur à l'autre.

Et les déclarations dans les boucles (for int...), c'est du C avancé, ça passe pas sur les vieux compilos. Ce genre de truc peut être intéressant en C++ (Appel de constructeur que sous certaines conditions), mais en C ça n'a aucun intérêt.

Et aussi le getchar n'a pas lieu d'être dans un vraie appli console. Si toutes les applis consoles avait une pause à la fin ce serait horrible et inutilisable. Si c'est à cause de ton environnement de dev, tu peux par exemple mettre un point d'arrêt sur le return 0;.

Quelque chose comme ça :

#include <stdio.h>

typedef char NAME[25];

int main ()
{
  NAME* lpNames;
  int nNamesCount;
  int nI;

  nNamesCount = 0;

  lpNames = (NAME*)malloc(1 * sizeof(NAME));

  puts("\nPour terminer, tapez EOF (Ctrl + Z) ");
  while (1)
  {
    printf("\nVeuillez entrer un nom svp: ");
    gets(lpNames[nNamesCount]);
    if (feof(stdin)) break;
    nNamesCount++;
    lpNames = (NAME*)realloc(lpNames, (nNamesCount + 1) * sizeof(NAME));
  }

  printf ("Liste de noms saisis: ");
  for (nI = 0; nI < nNamesCount; nI++) 
  {
    printf ("%s ", lpNames[nI]);
  }

  free(lpNames);

  return 0;
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 197 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
1055
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
0
Merci
Salut
Regarde du coté de la stl avec les vector:
tu feras quelque chose comme cela:
vector<char>Noms;
Noms.push_back("monNom");

et tu y accèdes comme ceci:
for (int n = 0; n<i; n++)
{
printf ("%s ",Noms[n]);
}

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Commenter la réponse de Pistol_Pete
Messages postés
10
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 avril 2010
0
Merci
Merci Pistol_Pete, mais je crois que les vectors machins c'est du C++.
Je dois coder en langage C uniquement. Nouvelles suggestions!?
Commenter la réponse de Smanyx
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
9
0
Merci
Arf, j'ai oublié l'include de stdlib pour malloc/realloc/free.
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
jeudi 5 février 2009
Statut
Membre
Dernière intervention
14 avril 2010
0
Merci
Merci beaucoup, rt15, surtout pour les petites remarques/ observations toujours aussi pertinantes et qui sont très utiles surtout pour des gens comme moi qui se forment et apprennent l'essentiel sur l'Internet.

Smanyx.
Commenter la réponse de Smanyx