Lire en Tableau de Char* dans un fonction

Mathieu -  
tuxun Messages postés 388 Statut Membre -
Bonjour,
J'ai un programme a faire pour un cour et l'une des fonction me cause des problème:

Lire une tableau de chaine de caractère dans une fonction en passant par référence pour que les lecture soit conserver dans le main.

voici ma fonction:

void remplir_Tableau(char* tbl_Elem[4],int nb_Elem)
{
for (int i=0;i<nb_Elem;i++)
{
fflush(stdin);
scanf("%s",tbl_Elem[i]);
}
}


le problème est que lorsque je l'exécute, le programme me renvoie une erreur dès que j'entre la première valeur.
A voir également:

3 réponses

tuxun Messages postés 388 Statut Membre 34
 
#include <stdio.h>
#include <stdlib.h>
void remplir_Tableau(char* tbl_Elem[4],int nb_Elem)
  {int i=0;
  for (i=0;i<nb_Elem;i++)
    {
    fflush(stdin);
    if(scanf("%s",   tbl_Elem[i])<1)exit(EXIT_FAILURE);
    printf("%i\n",i);
    //scanf prend un pointeur vers un tablo de char et non pas un tablo de 4ptr
    }
  }

int main (void){
    char **tab1=malloc(sizeof(char**));
remplir_Tableau(tab1,4);
return 0;
  }
//tuxun.the.free.linuxian@gmail.com
//this doesn't bug;
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Salut,
Ce programme ne risque pas de marcher.
Il manque plein d'allocations.
0
tuxun Messages postés 388 Statut Membre 34 > fiddy Messages postés 11653 Statut Contributeur
 
le mien ou le sien?

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

char *
mmgetstr (void)
{
  char *str = malloc (1000 * sizeof (char));
  fgets (str, 1000, stdin);
  int i = 0;
  while (str[i] != '\n')
    i++;
  str[i] = '\0';
  return str;
  return NULL;
}

int remplir_ton_Tableau(char** tbl_Elem,int nb_Elem)
  {

    int i=0;
    for (i=0;i<nb_Elem;i++)
        {
        *tbl_Elem=(char*)mmgetstr();
        if(*tbl_Elem!=NULL)
            {
            printf("%i:%s\n",i,*tbl_Elem);
            *tbl_Elem++;
            }
        else return EXIT_FAILURE;
        }
    return EXIT_SUCCESS;

    }

int main (void){
    char **tab1=malloc(sizeof(char**));
    return remplir_ton_Tableau(tab1,4);
  }
0
fiddy Messages postés 11653 Statut Contributeur 1 847 > tuxun Messages postés 388 Statut Membre
 
Je parlais bien du tien. Dans ta première version, il manquait des allocations.
Cette version est déjà mieux. Mais tu n'as pas libérer les zones allouées du tas avec free.
Dans ta fonction mmgetstr, tu mets :
  return str;
  return NULL;

Le return NULL; ne sera jamais atteint.

Tu mets également :
 while (str[i] != '\n')
    i++;

Très dangereux si la chaîne ne contient pas de \n, ce qui arrive si une longue chaîne est entrée (supérieure à 999). Il faut utiliser également une condition sur i ou utiliser tout simplement strchr de string.h.

Cdlt
0
tuxun Messages postés 388 Statut Membre 34 > fiddy Messages postés 11653 Statut Contributeur
 
desolé mon IDE bug, mon C date un peu...(et je navais pas dormi depuis 36h)
je voulais surtout lui montrer le principe que j'aurais appliqué:
un tablo de ptr sur chaine! donc
char **tab=malloc(sizeof(sizeof(char**)); //dans le main a liberer apres utilisation
{scanf(*tab);//ds retourne_un_tablo() //alloue en fonction de la chaine retourné
*tab++;}
et on recommence

...
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Je pense que c'est une histoire d'allocation mémoire non faites (il faudrait voir ce que tu as mis dans le main)
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Salut,
Effectivement, il doit s'agir d'une erreur d'allocation. Puisque tu ne l'as pas fait dans la fonction remplir, tu l'as peut-être fait dans la fonction appelante. Poste nous donc la définition de ton tableau.

Cdlt
0