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 :

Vérifier la bonne exécution de strtok


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 190
    Par défaut Vérifier la bonne exécution de strtok
    Bonjour à tous,

    Voici j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneVariable = strtok("une chaine", " ");
    Je découpe donc pas chaîne de caractère avec un espace " ".
    Admettons que le deuxième paramètre change : "-".

    strtok ne fera rien. Comment faire un test pour savoir si il découpe ou pas ?
    J'ai besoin de le tester car ma chaîne de caractère passé à strtok et le caractère de découpe sont passé en argument du programme.

    Donc, l'erreur est possible.

    Merci pour vos réponses.
    (j'ai regardé le man mais je ne vois rien à part que sa retourne un type char et le NULL pour réutiliser le premier paramètre. De plus, j'ai testé ma variable qui récupère le résultat avec 0 et NULL, rien...)

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Le man dit : "évitez au maximum d'utiliser cette fonction".

    Pourquoi ne pas coder ta propre fonction strtok ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char * decouper(char ** chaine, char caractere)
    {
               for(int i = 0; (*chaine)[i] && (*chaine)[i] != caractere; i++);
               char * resultat = (char *)malloc(sizeof(char)*i);
               strncpy(resultat, *chaine, i-1);
               resultat[i] = 0;
               *chaine += i;
               return resultat;
    }
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char maChaine[] = "toto yyy-9";
    char *tmp = maChaine;
    char * c1 = decouper(&tmp, " ");
    char * c2 = decouper(&tmp, "-");
    char * c3 = decouper(&tmp, "-");
     
     
    free(c1); free(c2); free(c3);

  3. #3
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 190
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Le man dit : "évitez au maximum d'utiliser cette fonction".
    Parce que c'est mon prof qui m'en a parlé

    Mon man (je suis sur Mac) dis ceci par contre :
    This interface is obsoleted by strsep(3).

    Sinon merci pour ton code, je regarderais de plus près ce soir. Mais par quel moyen je peux vérifier que ça fonctionne ? Autrement dis, être sûr qu'il y'a bien découpage dans toutes mes variables ? (actuellement j'en ai 4 qui reçoivent le résultat de strtok en passant une chaîne et ensuite NULL pour qu'il continu avec la même chaine mais modifié).

    EDIT : genre renvoyer NULL, comme le fait strsep si elle ne trouve pas serait parfait.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Gueuz Voir le message
    Parce que c'est mon prof qui m'en a parlé
    Même si strtok est conforme à la norme C ainsi, je trouve que c'est une fonction vraiment sale.
    Si un jour tu décides d'ajouter un thread à ton code, ton programme va planter à cause de strtok.


    Citation Envoyé par Gueuz Voir le message
    Mon man (je suis sur Mac) dis ceci par contre :
    This interface is obsoleted by strsep(3).
    Je ne connaissais pas cette fonction, c'est à peu près ce que je te proposais.
    Je te conseillerais de ne pas utiliser cette fonction et de l'écrire toi-même pour avoir un code portable (et puis comme tu es dans une phase d'apprentissage, ça ne te fera pas de mal^^).

    Citation Envoyé par Gueuz Voir le message
    Mais par quel moyen je peux vérifier que ça fonctionne ? Autrement dis, être sûr qu'il y'a bien découpage dans toutes mes variables ? (actuellement j'en ai 4 qui reçoivent le résultat de strtok en passant une chaîne et ensuite NULL pour qu'il continu avec la même chaine mais modifié).

    EDIT : genre renvoyer NULL, comme le fait strsep si elle ne trouve pas serait parfait.
    Après je ne t'ai passé que le code de base.
    Je suppose que tu préfère ceci :

    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
    char * decouper(char ** chaine, char caractere)
    {
               if(*chaine == NULL) return NULL;
               for(int i = 0; (*chaine)[i] && (*chaine)[i] != caractere; i++);
               char * resultat = (char *)malloc(sizeof(char)*i);
               strncpy(resultat, *chaine, i-1);
               resultat[i] = 0;
               if( (*chaine)[i] == 0)
                          *chaine = NULL; //indique que le découpage est terminé
               else
                          *chaine += (i + 1); //inattention de ma part.
               if(i == 0)
               {
                    (*chaine)++; //si deux caractère de délimitation se suivent.
                    return NULL;
                }
               return resultat;
    }
    /!\ Je l'ai fait à la va-vite, il peut y avoir quelques erreurs.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 190
    Par défaut
    Merci pour ta réponse complète, précise et pertinente.
    Quand je t'ai répondu j'était sur le départ mais ce soir je vais regardé ça de plus près et je te dirais...

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Tu remarqueras que j'ai fait une petite erreur dans mon code.

    Il faudra donc que tu comprenne ce que le code fait et ce qu'il doit faire pour la trouver.

    On va dire que j'ai fait cette erreur exprès dans un but pédagogique
    Ok, j'avoue, je ne l'ai pas fait exprès

Discussions similaires

  1. Tester la bonne exécution d'un shell
    Par mederik dans le forum Shell et commandes POSIX
    Réponses: 7
    Dernier message: 11/06/2013, 08h57
  2. [vim] Comment vérifier la bonne fermeture des if et do
    Par Erlen dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 27/10/2012, 12h16
  3. Vérifier la bonne saisie d'une chaine
    Par francois.delpierre dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/03/2011, 15h09
  4. Réponses: 5
    Dernier message: 30/09/2010, 16h46
  5. Réponses: 11
    Dernier message: 25/01/2007, 11h05

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