IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Une Fonction en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Par défaut Une Fonction en C
    Bonjour,
    je suis un débutant en Programmation C (ANSI) sous Ubuntu Linux et je Compile avec le GCC de GNU. je voudrai vous demande un petit coup de pouce pour rectifier mon petit programme pour qu'il puisse lire un fichier texte le stocker mot par mot dans un tableau de chaînes de caractères . et afficher le contenu de ce tableau par une deuxième fonction.
    Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    /*
     * Lecture simplifié d'un fichier texte 
     * Auteur :
     * Date :
     */
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define LGMAX 30
    #define MAXMOTS 100
     
     
    /*
     * Structure simple de la fonction lireDico
     * Lecture du fichier et affichage sur l'ecran
     * sans utilisation de structures de données
    void lireDico(char *nomFichier)
    {
      FILE *f;
      char tmp[LGMAX];
      f=fopen(nomFichier,"r");
      if(f==NULL)
        {
          fprintf(stderr,"Erreur d'ouverture du fichier ( %s )!\n",nomFichier);
          exit(1);
        }
      else
        fprintf(stdout,"Ouverture avec Succes !\n\n");
      while(fscanf(f,"%s",tmp)!=EOF)
        printf("%s\n",tmp);
      fclose(f);
    }
     
     
     */
     
     
     
    /* Declaration de la variable Globale
     * Structure de donnée tableau de
     * chaines de caractères 
     */
    void lireDicotab(char *nomFichier,char *dictionnaire[MAXMOTS])
    {
      FILE *f;
      char tmp[LGMAX];
      int i=0;
      f=fopen(nomFichier,"r");
      if(f==NULL)
        {
          fprintf(stderr,"Erreur d'ouverture du fichier ( %s )!\n",nomFichier);
          exit(1);
        }
      else
        fprintf(stdout,"Ouverture avec Succes !\n\n");
      while((fscanf(f,"%s",tmp)!=EOF) && i<MAXMOTS)
        {
          dictionnaire[i]=tmp;
         // printf("%s\n",dictionnaire[i]);
          i++;
        }
     
     
      fclose(f);
     
    }
     
    /* Fonction pour affichage des mots du dictionnaire */
    void afficher(char *dictionnaire[MAXMOTS])
    {
      int j;
      for(j=0;j<=MAXMOTS;j++)
        {
          printf("%s\n",dictionnaire[j]);
          j++;
        }
      printf("Fonction executée avec succes !\n");
    }
     
     
     
     
    int main(int argc,char *argv[])
    {
      char *filename;
      char *dictionnaire[MAXMOTS] = (char *)malloc(MAXMOTS*sizeof(char)*LGMAX);
      // int ** a = malloc(nrows * sizeof *a );
     
      filename=argv[1];
      // lireDico(filename);
      lireDicotab(filename,dictionnaire);
      afficher(dictionnaire);
     
      fprintf(stdout,"\nOn atteint la fin - Fichier Close !\n");
      return EXIT_SUCCESS;
    }

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Par défaut Bonjour
    Citation Envoyé par ubu1707 Voir le message
    Bonjour,
    je suis un débutant en Programmation C (ANSI)
    Bonjour

    avant commencé STP tu click sur le bouton Editer en bas et ajoute la balise pour ton code et supprime les instructions inutiles merci
    regarde ton code comment il est jolie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    /*
    * Lecture simplifié d'un fichier texte
    * Auteur :
    * Date :
    */
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define LGMAX 30
    #define MAXMOTS 100
     
     
    /*
    * Structure simple de la fonction lireDico
    * Lecture du fichier et affichage sur l'ecran
    * sans utilisation de structures de données
    void lireDico(char *nomFichier)
    {
    FILE *f;
    char tmp[LGMAX];
    f=fopen(nomFichier,"r");
    if(f==NULL)
    {
    fprintf(stderr,"Erreur d'ouverture du fichier ( %s )!\n",nomFichier);
    exit(1);
    }
    else
    fprintf(stdout,"Ouverture avec Succes !\n\n");
    while(fscanf(f,"%s",tmp)!=EOF)
    printf("%s\n",tmp);
    fclose(f);
    }
     
     
    */
     
     
     
    /* Declaration de la variable Globale
    * Structure de donnée tableau de
    * chaines de caractères
    */
    void lireDicotab(char *nomFichier,char *dictionnaire[MAXMOTS])
    {
    FILE *f;
    char tmp[LGMAX];
    int i=0;
    f=fopen(nomFichier,"r");
    if(f==NULL)
    {
    fprintf(stderr,"Erreur d'ouverture du fichier ( %s )!\n",nomFichier);
    exit(1);
    }
    else
    fprintf(stdout,"Ouverture avec Succes !\n\n");
    while((fscanf(f,"%s",tmp)!=EOF) && i<MAXMOTS)
    {
    dictionnaire[i]=tmp;
    // printf("%s\n",dictionnaire[i]);
    i++;
    }
     
     
    fclose(f);
     
    }
     
    /* Fonction pour affichage des mots du dictionnaire */
    void afficher(char *dictionnaire[MAXMOTS])
    {
    int j;
    for(j=0;j<=MAXMOTS;j++)
    {
    printf("%s\n",dictionnaire[j]);
    j++;
    }
    printf("Fonction executée avec succes !\n");
    }
     
     
     
     
    int main(int argc,char *argv[])
    {
    char *filename;
    char *dictionnaire[MAXMOTS] = (char *)malloc(MAXMOTS*sizeof(char)*LGMAX);
    // int ** a = malloc(nrows * sizeof *a );
     
    filename=argv[1];
    // lireDico(filename);
    lireDicotab(filename,dictionnaire);
    afficher(dictionnaire);
     
    fprintf(stdout,"\nOn atteint la fin - Fichier Close !\n");
    return EXIT_SUCCESS;
    }
    et après la coloration syntaxique je constate qu'il y a une fonction inutile alors STP modifier ton code puis dis nous exactement c'est quoi ton problème
    Juste une petite remarque fait attention à l'instruction j++; car il a y des affichages ratés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* Fonction pour affichage des mots du dictionnaire */
    void afficher(char *dictionnaire[MAXMOTS])
    {
    int j;
    for(j=0;j<=MAXMOTS;j++)
    {
    printf("%s\n",dictionnaire[j]);
    j++;// mot raté pour chaque incrémentation
    }
    printf("Fonction executée avec succes !\n");
    }
    Bonne journée

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Déjà, gcc n'est pas d'accord pour compiler avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >gcc -Wall -Wextra 08-10-15.c
    08-10-15.c: In function `main':
    08-10-15.c:87: error: invalid initializer
    08-10-15.c: At top level:
    08-10-15.c:84: warning: unused parameter 'argc'
    La ligne suivante pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *dictionnaire[MAXMOTS] = (char*) malloc(MAXMOTS*sizeof(char)*LGMAX);
    On veut allouer de la mémoire pour un tableau de pointeur de taille fixe.
    La bonne écriture aurai été :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *dictionnaire[MAXMOTS];
    for(i = 0; i < MAXMOTS; ++i) {
      dictionnaire[i] = malloc(LGMAX);
    }
    Mais allouer dynamiquement des tableaux de taille fixe est rarement utile et contraignant puisqu'il faut tester que la fonction malloc a bien fonctionné, autant écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char dictionnaire[MAXMOTS][LGMAX];
    gcc lève aussi un warning sur la non utilisation de argc. Il a raison, si le programme est lancé sans argument, argv[1] n'est pas défini, le comportement du programme non plus...

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Autre chose
    une copie de chaine de caractères ne se fait pas comme ça :
    Mais à l'aide de la fonction str[n]cpy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(dictionnaire[i], tmp, LGMAX);

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sachant que strncpy() ne termine pas la chaîne en cas de dépassement de buffer.
    Il est plus sûr d'utiliser strncat() comme ceci :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char* mystrncpy(char *dest, char const *src, size_t cchDestSize)
    {
    	size_t cchDestLength = cchDestSize - 1;
    	assert(dest != NULL);
    	assert(src != NULL);
    	dest[0] = '\0';
    	return strncat(dest, src, cchDestLength);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3
    Par défaut 2eme version mais ne marche pas
    Merci beaucoup de votre aide je suis tujours entrain de voir purquoi ça marche pas! j'ai changer très peut de truc et ça s'execute mais en voyant le resultats (erreur de segmentation ) du probablement à l'allocation du tableau dictionnaire. merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    /*
     * Lecture simplifié d'un fichier texte 
     * Auteur :
     * Date :
     */
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define LGMAX 30
    #define MAXMOTS 100
     
     
    /*
     * Structure simple de la fonction lireDico
     * Lecture du fichier et affichage sur l'ecran
     * sans utilisation de structures de données
    void lireDico(char *nomFichier)
    {
      FILE *f;
      char tmp[LGMAX];
      f=fopen(nomFichier,"r");
      if(f==NULL)
        {
          fprintf(stderr,"Erreur d'ouverture du fichier ( %s )!\n",nomFichier);
          exit(1);
        }
      else
        fprintf(stdout,"Ouverture avec Succes !\n\n");
      while(fscanf(f,"%s",tmp)!=EOF)
        printf("%s\n",tmp);
      fclose(f);
    }
     
     
     */
     
     
     
    /* Declaration de la variable Globale
     * Structure de donnée tableau de
     * chaines de caractères 
     */
    void lireDicotab(char *nomFichier,char *dictionnaire[MAXMOTS])
    {
      FILE *f;
      char tmp[LGMAX];
      int i=0;
      f=fopen(nomFichier,"r");
      if(f==NULL){
        fprintf(stderr,"Erreur d'ouverture du fichier ( %s )!\n",nomFichier);
        exit(1);
      }
      else
        fprintf(stdout,"Ouverture avec Succes !\n\n");
      while((fscanf(f,"%s",tmp)!=EOF) && i<MAXMOTS){
        dictionnaire[i]=tmp;
        i++;
      }
      fclose(f);
    }
     
    /* Fonction pour affichage des mots du dictionnaire */
    void afficher(char *dictionnaire[MAXMOTS])
    {
      int j;
      for(j=0;j<=MAXMOTS;j++){
        printf("%s\n",dictionnaire[j]);
      }
      printf("Fonction executée avec succes !\n");
    }
     
     
     
     
    int main(int argc,char *argv[])
    {
      char *filename;
      int i;
      // char *dictionnaire;// = (char*)malloc(MAXMOTS);
       char *dictionnaire[MAXMOTS];
       //char dictionnaire[MAXMOTS][LGMAX];
      for(i = 0; i < MAXMOTS; ++i) {
        dictionnaire[i] = (char*)malloc(LGMAX);
      }
      filename=argv[1];
      // lireDico(filename);
      lireDicotab(filename,dictionnaire); /* Lecture à partir du fichier */
      afficher(dictionnaire); /* afficher le dictionnaire */
      fprintf(stdout,"\nOn atteint la fin - Fichier Close !\n");
      return EXIT_SUCCESS;
    }

Discussions similaires

  1. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  2. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo