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 strtok_r et strcat


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Par défaut Problème avec strtok_r et strcat
    Salut tout le monde !

    S.V.P , est-ce que vous pouvez me donner un petit programme (code) pour me montrer comment marche la fonction strtok_r() ?

    Aussi j'ai eu un problème avec la fonction strcat(), moi je veux concaténer deux chaines de caractères mais qui sont toutes les deux variables au cours du programme, et cette fonction exige que le deuxième argument soit constant . Est-ce qu'il existe une fonction de C qui me permet de le faire ou pas !

    Merci d'avance.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par laracroft87 Voir le message
    S.V.P ,est ce que vous pouvez me donner un petit programme (code) pour me montrer comment marche la fonction strtok_r() .
    Comme strtok, mais sur un buffer dynamique à l'utilisateur de fournir :

    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main ()
    {
      char str[] ="petit:exemple";
      char * buffer = strdup(str);
      char * c;
      if(NULL == buffer) {
        perror("strdup");
      } else {
        c = strtok_r (str,":", &buffer);
        while (NULL != c)
        {
          printf ("%s\n",c);
          c = strtok_r (NULL, ":", &buffer);
        }
        free(buffer);
      }
      return 0;
    }
    Citation Envoyé par laracroft87 Voir le message
    aussi j'ai eu un pbléme avec la fonction strcat(), moi je veux concatener deux chaines de caractéres mais qui sont toutes les deux variables au cours du programme,et cette fonction exige que le dexiéme argument soit constant
    est ce qu'il existe une fonction de C qui me permet de le faire ou pas !
    Le const char * en paramètre d'une fonction explique que le fonction en question ne va pas modifier le contenu de la chaine de caractère.

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,


    Comme strtok, mais sur un buffer dynamique à l'utilisateur de fournir :

    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main ()
    {
      char str[] ="petit:exemple";
      char * buffer = strdup(str);
      char * c;
      if(NULL == buffer) {
        perror("strdup");
      } else {
        c = strtok_r (str,":", &buffer);
        while (NULL != c)
        {
          printf ("%s\n",c);
          c = strtok_r (NULL, ":", &buffer);
        }
        free(buffer);
      }
      return 0;
    }

    Le const char * en paramètre d'une fonction explique que le fonction en question ne va pas modifier le contenu de la chaine de caractère.
    toi non plus visiblement tu ne sais pas te servir de strtok_r():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * buffer = strdup(str);
    il n'y a rien à allouer pour buffer, revois la norme!

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    il n'y a rien à allouer pour buffer, revois la norme!
    Pourtant :
    Citation Envoyé par http://man.developpez.com/man3/strtok.3.php
    La fonction strtok_r() est identique à strtok() mais au lieu d'utiliser un buffer statique, elle emploie un pointeur sur un buffer "char *" alloué par l'utilisateur. Ce pointeur transmis comme paramètre ptrptr doit être toujours le même durant l'analyse d'une chaîne.
    Bon, mea culpa, je viens de regarder la même man en anglais, aucune allocation mémoire n'est suggérée....

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Par défaut
    Le const char * en paramètre d'une fonction explique que le fonction en question ne va pas modifier le contenu de la chaine de caractère.

    regarder cet exemple SVP :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         char *ch1;
         char *ch2;
         scanf("%s",&ch1);   
         scanf("%s",&ch2);
         strcat(ch1,ch2);
    au cours de la compilation il me detecte rien comme erreur,mais dés que j'execute il se bloque
    mais quand je fixe ch2 a (char *ch2="bjr "; ) ça marche tres bien

    est ce que quelqu'un peut me dire pourquoi ?? et comment remedier ce probléme !!

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *ch1;
    char *ch2;
    scanf("%s",&ch1);
    scanf("%s",&ch2);
    ....
    ne marche pas parce que ch1 (ou ch2) est un pointeur, pas un tableau. Comment veux-tu qu'on puisse mettre les caractères lus dans un pointeur ?
    mais quand je fixe ch2 a (char *ch2="bjr "; ) ça marche tres bien
    Alors là, il y a bien un tableau dont l'adresse est mise dans ch2. MAIS, ce tableau n'est pas modifiable, donc on ne doit pas non plus écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *ch2="bjr ";
    scanf("%s",&ch2); //ERREUR : on veut mettre dans le pointeur comme ci-dessus
    scanf("%s",ch2);  //ERREUR : on veut mettre dans un tableau non modifiable
    Pour éviter ce genre de chose, on devrait écrire const char * ch2 ="bjr ";

    La solution est donc de passer un tableau (dont le contenu soit modifiable) au scanf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char ch2[/*suffisamment de place*/];
    scanf("%s",ch2);

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est parce que derrière tes 2 pointeurs, il n'y a pas de mémoire allouée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char ch1[1024];
    char ch2[1024];
    scanf("%s",ch1);   
    scanf("%s",ch2);
    strcat(ch1,ch2);
    Par contre, c'est à toi de gérer le fait que les chaines saisie ne feront jamais plus de 1023 caractères et que la concaténation des 2 chaines ne fera jamais plus de 1023 caractères. Sinon, c'est un bug que tu auras du mal à identifier.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Par défaut
    slt !!
    quand on fait
    char *ch ;
    on peut meme manipuler ch comme etant tableau de caractére !! n'est ce pas
    merci d'avance pour vos réponses

  9. #9
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Biensur que tu peux, mais il faut d'abord allouer de la memoire pour contenir la chaine de caractères !

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par laracroft87 Voir le message
    slt !!
    quand on fait
    char *ch ;
    on peut meme manipuler ch comme etant tableau de caractére !! n'est ce pas
    merci d'avance pour vos réponses
    NON
    ch est un pointeur, pas un tableau de caractères.

    SI ch est l'adresse du premier élément d'un tableau de caractères, alors on accède aux éléments classiquement par ch[...].
    C'est le cas dans la situation évoquée par buggen25, où le tableau a été créé par exemple par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * ch = malloc(....);
    ou dans le cas

  11. #11
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    P'tèt un exemple plus simple :
    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
    #include <stdio.h>
    #include <string.h>
     
    int main()
    {
        char lpBuffer[100], separators[] = " \t.,!?\n", *p, *q;
     
        printf("Entrez une chaine de caracteres : ");
        fgets(lpBuffer, sizeof(lpBuffer), stdin);
     
        printf("\n");
     
        p = strtok_r(lpBuffer, separators, &q);
        while(p != NULL)
        {
            printf("%s\n", p);
            p = strtok_r(NULL, separators, &q);
        }
     
        return 0;
    }
    Note : strtok_r n'est pas normalisée. Elle n'est donc pas aussi portable que strtok (qui est normalisée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <string.h>
     
    int main()
    {
        char t[50], *s1 = "Hello", *s2 = ", world !";
     
        strcpy(t, "");
        strcat(t, s1);
        strcat(t, s2);
        printf("%s\n", t);
     
        return 0;
    }
    ... et cette fonction exige que le deuxième argument soit constant
    Non, cette fonction force les données pointées à être considérées comme des constantes.

    Quelle est la différence entre pointeurs constants et pointeurs sur constante ?

  12. #12
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Melem Voir le message
    Note : strtok_r n'est pas normalisée. Elle n'est donc pas aussi portable que strtok (qui est normalisée).
    http://www.opengroup.org/onlinepubs/...ns/strtok.html

  13. #13
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    @nicolas.sitbon : Ah, je ne savais pas qu'elle a été ajoutée au C99 (toujours en retard ). Merci pour l'info.

    @mabu : Il faut faire une sauvegarde de la chaîne passée à strtok(_r) seulement si on souhaite encore l'utiliser plus tard car la fonction modifie la chaîne.

  14. #14
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Melem Voir le message
    @nicolas.sitbon : Ah, je ne savais pas qu'elle a été ajoutée au C99 (toujours en retard ). Merci pour l'info.
    Non tu n'es pas en retard, ce n'est pas normalisé par le langage C mais par la norme POSIX.

  15. #15
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    OK, j'avoue que je n'ai même pas suivi le lien , je me suis juste dit que ça sentait le C99 (que je n'utilise toujours pas ...). Qu'elle était normalisée par POSIX, ça je le savais. Mais je faisais référence à LA norme du C, c'est-à-dire celle publiée par l'ISO et non POSIX .

Discussions similaires

  1. Problème avec strcat
    Par talapoga dans le forum Débuter
    Réponses: 2
    Dernier message: 10/04/2015, 13h46
  2. Problème avec strcat
    Par choupinette116 dans le forum Débuter
    Réponses: 5
    Dernier message: 21/04/2008, 17h42
  3. Problème avec la fonction strcat
    Par saddamtohmto dans le forum MATLAB
    Réponses: 10
    Dernier message: 18/07/2007, 07h57
  4. Problème avec la fonction Strcat
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 29/01/2007, 21h34
  5. 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