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 :

problème avec memset()


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut problème avec memset()
    Bonjour,

    j'ai fait un code qui doit chercher un mot dans un fichier texte et extraire le mot d'aprés:
    le problème que j'ai cc'est qu'il ne trouve jamais le mot ( le pointeur est tjrs null), donc j'ai initialiser mon tableau buf_pipe, mais maintenant il ne voit pas le mot que je cheche, il fait juste l'extraction....
    je ne sais pas si je suis claire ou pas..
    voila mon code:

    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
    void analyse( descStruct *pdescStruct, FILE *cmdFile)
    {
      char buf_pipe[20];
      char buf_cmdFile[41];
      char * ptr_tCmd;
      char * position;
      char answer[50];
     // int CmdFind = 0;
     
     
     
     
    //on cherche la ligne qui contient le mot buf_pipe
      if( NULL != fgets ( buf_pipe, 20, pdescStruct->fd) )
      {
    	  printf(" \n la valeur de buf_pipe est: %s\n", buf_pipe);
    	  rewind(cmdFile);
    	  while(fgets( buf_cmdFile, 40, cmdFile) )
    	  {
     
    	    //initialization of buf_pipe
    	    memset( buf_pipe, 0,sizeof(buf_pipe));
    	    printf("\n\n\n");
    	    printf("\n???????????????????????????????????????????????????");
    	    printf("\n la commande extraite avant la boucle if est: %s ", buf_pipe);
    	    printf("\n la ligne extraite avant la boucle if est: %s ",buf_cmdFile);
    	    printf("\n???????????????????????????????????????????????????");
     
    	    ptr_tCmd = strstr ( buf_cmdFile, buf_pipe);// recherche du mot dans la ligne
    	    printf( "\n\n\n la valeur du pointeur sur la ligne est égal à: %p\n", ptr_tCmd );
    	    if (ptr_tCmd)
    	    {
    		printf("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
    		printf("\n the comande to extract is: %s ", buf_pipe);
    		printf("\n the line extracted is: %s ",buf_cmdFile);
    		printf("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
    		position = strstr (buf_cmdFile,";"); //extract the answer
    		strcpy( answer, (char*)(position + 1) );
     
    		// copy answer in pipe
    		fwrite( answer, strlen( answer),1, pdescStruct->fd);
    		printf("\n\n\n");
    		printf("\n..........................................");
    		printf("\n the answer is: %s ",answer);
    		printf("\n...........................................");
    		//CmdFind = 1;
    	    }
    	    else 
    	      printf(" the command dosnt exist in the texte file");
     
    	  }
     
      }
     
    }
    merci de m'aider , j'en ai vraiment besoin.

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

    Tu affecte déjà buf_pipe avec fgets. Pourquoi veux tu utiliser memset en plus ?
    Retire le memset, ton programme devrait fonctionner mieux.

    Il faut aussi laisser le la place à fgets pour qu'il ajouter un '\0' à la fin de buf_pipe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( NULL != fgets ( buf_pipe, 19, pdescStruct->fd) )
    ou mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( NULL != fgets ( buf_pipe, sizeof buf_pipe - 1, pdescStruct->fd) )
    PS : si tu tiens absolument à initialiser buf_pipe, tu peux le déclarer comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buf_pipe[20] = "";
    EDIT:
    Merci d'utiliser les balises code (bouton #)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    merci mabu pour ta réponse..
    si je ne met pas la fonction memset(), mon pointeur mrt_tCmd est toujours null, et donc il n ya pas d'extraction....
    je ne sais pas c'est quoi le problème....
    moi je pensai que c'étai l'initialisation qui manquait.....

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    N'y a-t-il pas un caractère en trop dans buf_pipe ? Genre un '\n' ?
    Citation Envoyé par man fgets
    The fgets() function reads at most one less than the number of characters
    specified by n from the given stream and stores them in the string s.
    Reading stops when a newline character is found, at end-of-file or error.
    The newline, if any, is retained. If any characters are read and there
    is no error, a `\0' character is appended to end the string.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    qu'est ce que je doi faire pour savoir si ca vient de la????

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bellevue Voir le message
    qu'est ce que je doi faire pour savoir si ca vient de la????
    En pratique, le plus simple est d'utiliser un débogueur pour voir le contenu de buf_pipe.

    Après, comment est formaté le fichier depuis lequel tu lis buf_pipe (celui pointé par pdescStruct->fd) ?

    Après, tu peux améliorer ta trace. Ajouter des chevrons rendra plus lisible le contenu de buf_pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf("\n???????????????????????????????????????????????????");
    printf("\n la commande extraite avant la boucle if est: <%s> ", buf_pipe);
    printf("\n la ligne extraite avant la boucle if est: <%s>",buf_cmdFile);
    printf("\n???????????????????????????????????????????????????");

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    on lit le buf_pipe (commande) a partir d'un pipe, on prend cette commande et on va la chercher dans un fichiers texte ecris comme cela:
    cmd1;answer1
    cmd2;answer2
    cmd3;answer3
    .
    .
    .
    etc.....

    mais mon programme...même s'elle est là la commande il ne la voi pas.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    quand j'enlève la fonction memset, l'affichage de la commandeest correcte par contre il n'extrait pas la réponse ( le pointeur est tjrs null.

    et quand je laisse le fonction memset(), la commande devient vide ( il m'affiche <>) et il arrive a extraire les reponses ( des toutes les lignes pas juste celle qui m'interesse).

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    quand j'enlève la fonction memset, l'affichage de la commandeest correcte par contre il n'extrait pas la réponse ( le pointeur est tjrs null.
    Tu as un affichage qui ressemble à
    ou ?




    Avant la ligne qui contient fonction strstr, met ces lignes et dis nous ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(NULL != strchr(buf_pipe, '\n')) {
        printf("Attention, buf_pipe contient un saut de ligne!!\n");
    }



    mais mon programme...même s'elle est là la commande il ne la voi pas.
    ??

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    c'est plutot le deuxième affichage que j'ai

    ?


    en ce qui concerne le bout de code que j'ai rajouté...ca ne change rien.......il print rien

    quand je dis qu'il ne voit pas la commande, c'est que le pointeur prt_tCmd reste null, alors que la ligne contienne la commande et il passe a la ligne d'aprés saans s'arrêter.

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bellevue Voir le message
    c'est plutot le deuxième affichage que j'ai

    Ça veut dire que but_pipe contient des caractères en trop.

    Tu peux essayer d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( NULL != fgets ( buf_pipe, sizeof buf_pipe - 1, pdescStruct->fd))
    {
        /* retrait du dernier caractère de buf_pipe */
        buf_pipe[strlen(buf_pipe)] = '\0';
     
       /*  ... */
     
    }
    Ce code retirera le dernier caractère de buf_pipe, celui qui à mon avis pose problème.


    en ce qui concerne le bout de code que j'ai rajouté...ca ne change rien.......il print rien
    Bizarre... Et tu as quoi dans buf_pipe si tu le regardes avec un débogueur ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    déja avec ça ..ca a l'air de mieux marché...maintenant le pointeur ptr_tCmd prend, des fois, des valeurs non null...
    mais je n'arrive a avoir le contenu de buf_pipe......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     printf("\n la commande extraite avant la boucle if est: <%s>", buf_pipe);
    il m'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     la commande extraite avant la boucle if est: <>

  13. #13
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bellevue Voir le message
    ca a l'air de mieux marché...maintenant le pointeur ptr_tCmd prend, des fois, des valeurs non null...
    Peux tu poster le code actuel de la fonction analyse ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    voila le code actuel:
    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
     void analyse ( descStruct *pdescStruct, FILE *cmdFile)
    {
      char buf_pipe[20];
      char buf_cmdFile[40];
      char * ptr_tCmd;
      char * position;
      char answer[50];
      //int CmdFind = 0;
     
     
     
      if(NULL != fgets ( buf_pipe, sizeof (buf_pipe) -1, pdescStruct->fd) )
      {
    	  buf_pipe[strlen(buf_pipe)] = '\0';
    	  printf("\n la valeur de buf_pipe est: <%s>\n", buf_pipe);
    	  rewind(cmdFile);
     
    	  while(fgets( buf_cmdFile, sizeof (buf_cmdFile) - 1, cmdFile) )
    	  {
     
    	    printf("\n\n\n");
    	    printf("\n??????????????????????????????????????????????????????????");
    	    printf("\n la commande extraite avant la boucle if est: <%s>", buf_pipe);
    	    printf("\n la ligne extraite avant la boucle if est: <%s>",buf_cmdFile);
    	    printf("\n??????????????????????????????????????????????????????????");
     
    	    if(NULL != strchr(buf_pipe, '\n')) {
    	    printf("\n\n\n\n\nAttention, buf_pipe contient un saut de ligne!!\n\n\n\n\n");
    	    }
    	    ptr_tCmd = strstr ( buf_cmdFile, buf_pipe);
    	    printf( "\n\n\n la valeur du pointeur sur la ligne est égal à: %p\n", ptr_tCmd );
    	    if (ptr_tCmd)
    	    {
    		printf("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
    		printf("\n the comande to extract is: <%s>", buf_pipe);
    		printf("\n the line extracted is: <%s>",buf_cmdFile);
    		printf("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
    		position = strstr (buf_cmdFile,";"); //extract the answer
    		strcpy( answer, (char*)(position + 1) );
     
    		// copy answer in pipe
    		fwrite( answer, strlen( answer),1, pdescStruct->fd);
    		printf("\n\n\n");
    		printf("\n..........................................");
    		printf("\n the answer is: <%s>",answer);
    		printf("\n...........................................");
    		//CmdFind = 1;
     
    	    }
    	    else 
    	      printf(" the command dosnt exist in the texte file");
     
    	  }
     
      }
     
    }

  15. #15
    Invité(e)
    Invité(e)
    Par défaut
    Ton problème vient peut-être de la boucle de rechercher qui va indiquer pour chaque ligne si la commande est présente ou non, alors qu'on attend cet affichage qu'une seule fois :

    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
    void analyse(descStruct * pdescStruct, FILE * cmdFile)
    {
        char buf_pipe[20];
        char buf_cmdFile[40];
        char *ptr_tCmd;
        char *position;
        char answer[50];
        int CmdFind = 0;
     
        if (NULL != fgets(buf_pipe, sizeof(buf_pipe) - 1, pdescStruct->fd)) {
            buf_pipe[strlen(buf_pipe)] = '\0';
     
            rewind(cmdFile);
            while (fgets(buf_cmdFile, sizeof(buf_cmdFile) - 1, cmdFile)) {
     
                printf("\n\n\n");
                printf("\n??????????????????????????????????????????????????????????");
                printf("\n la commande extraite avant la boucle if est: <%s>",
                       buf_pipe);
                printf("\n la ligne extraite avant la boucle if est: <%s>",
                       buf_cmdFile);
                printf("\n??????????????????????????????????????????????????????????");
     
                ptr_tCmd = strstr(buf_cmdFile, buf_pipe);
                printf("\n\n\n la valeur du pointeur sur la ligne est égal à: %p\n",
                     ptr_tCmd);
                if (ptr_tCmd) {
                    printf("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
                    printf("\n the comande to extract is: <%s>", buf_pipe);
                    printf("\n the line extracted is: <%s>", buf_cmdFile);
                    printf("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
                    position = strstr(buf_cmdFile, ";");    //extract the answer
                    strcpy(answer, (char *) (position + 1));
     
                    // copy answer in pipe
                    fwrite(answer, strlen(answer), 1, pdescStruct->fd);
                    printf("\n\n\n");
                    printf("\n..........................................");
                    printf("\n the answer is: <%s>", answer);
                    printf("\n...........................................");
                    CmdFind = 1;
                    /* on sort de la boucle de recherche */
                    break;
                }
            }
            if (0 == CmdFind) {
                printf(" the command dosnt exist in the texte file");
            }
        }
    }
    mais je n'arrive a avoir le contenu de buf_pipe......
    Même en pas à pas ?

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    j'ai fait quelque changement dan le code, (j'ai remplacé strstr() par des strtok)
    je crois que le probleme vient de cette fonction...

    j'ai quelquechose de mieu...mais des fois il ne detecte pas toute la commande, par exemple une commande "tatatoto" il me sort "tatoto".

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Par défaut
    merci mabu pour tout,

    je vais laisser tomber pour aujourdhui et je reprendrais demain ....
    je te remercie beaucoup pour tout..
    bonne soirée.

  18. #18
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par mabu
    Il faut aussi laisser le la place à fgets pour qu'il ajouter un '\0' à la fin de buf_pipe :
    fgets() le prend déjà en compte:
    Citation Envoyé par man fgets
    fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s...
    Code bellevue : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(answer, strlen(answer), 1, pdescStruct->fd);
    Tu n'écris pas le '\0' c'est voulu ? j'aurais vu les choses comme ceci :
    Code bellevue : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(answer, strlen(answer) +1, 1, pdescStruct->fd);

    Avec ceci :
    Code bellevue : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buf_cmdFile[40];
    <...>
    while (fgets(buf_cmdFile, sizeof(buf_cmdFile) - 1, cmdFile)) {
    Tu supposes que tes lignes ne dépasses pas 39 caractères, est-ce le cas ?
    Le plus simple serait d'exposer clairement le format de ton fichier en plus d'un exemple.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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