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 :

Créer une fonction qui scinde un texte


Sujet :

C

  1. #1
    Membre confirmé Avatar de tonymx15
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juin 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 140
    Par défaut Créer une fonction qui scinde un texte
    Bonjour à tous,

    Je voudrais réaliser une fonction qui me retourne dans un tableau les chaines se trouvant autour du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char couperTexte(char texte[50], char separateur[10]){
        //traitement de la fonction
        return tab;
    }
    Exemple pour "edit toto" :

    couperTexte("edit toto", " ")[0] ---> "edit"
    couperTexte("edit toto", " ")[1] ---> "toto"

  2. #2
    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
    Regarde du côté de la fonction strtoken.

  3. #3
    Membre confirmé Avatar de tonymx15
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juin 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 140
    Par défaut
    fonction.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char couperTexte(char texte[50], char separateur[10]){
     
        int i = 0;
     
        char * resultat = strtok(texte, separateur);
     
        return resultat;
    }
    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        char commande[50];
        printf("==>");    
        fgets(commande, sizeof commande, stdin);
        printf("%s", couperTexte( commande," "));
    Comme ca ça ne marche pas...

  4. #4
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Tu peux préciser ce que ça te fait et ce que tu as mis pour commande et ce que tu obtiens?

  5. #5
    Membre confirmé Avatar de tonymx15
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juin 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 140
    Par défaut
    Pour commande j'ai mis "edit toto", j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ==>edit toto
    /Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/dlight2/bin/nativeexecution/dorun.sh: line 33:  5955 Segmentation fault      sh "${SHFILE}"
    Press [Enter] to close the terminal ...
    message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.c: In function 'couperTexte':
    main.c:25: warning: return makes integer from pointer without a cast

  6. #6
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    En fait c'est normal tu as mis:
    char couperTexte(char texte[50], char separateur[10])
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* couperTexte(char texte[50], char separateur[10])

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 38
    Par défaut
    Je c/c bêtement une fonction de coupe de chaîne de caractère que j'avais faite pour ma bibliothèque de fonctions perso:

    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
    99
    100
    101
    102
    103
    104
    105
    106
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int Fstr_ncompare(const char *t1, const char* t2, int lg)
    /* Compare les chaines de caractère t1 et t2 sur une longeur lg, si ils sont strictement identiques, renvoi 1, sinon 0.
        La comparaison s'arrête si la fonction atteint la fin d'une chaine de caractère, aucun risque de débordement si elles se terminent par '\0' */
    {
        int i;
        for(i=0; i<lg; i++)
        {
            if (t1[i] != t2[i]) return 0;
            if (t1[i] == '\0') return 1;
        }
        return 1;
    }
     
    int Fnb_str(const char *s, const char *sep, int taille)
    /* Renvoi le nombre d'occurence de la chaine de char sep dans la chaine de char 's' de taille 'taille' */
    {
        if (!taille)
            taille = strlen(s);
     
        int lg_sep = strlen(sep);
     
        int i;
        int retour = 0;
        for(i=0; i<taille; i++)
        {
            /* Si le caractère courant est le même que le premier de la chaine à rechercher... */
            if (s[i] == sep[0])
            {
                /* On recherche si la suite dans s est strictement identique à la chaine sep */
                if (Fstr_ncompare(&(s[i]), sep, lg_sep))
                    retour++;
            }
        }
        return retour;
    }
     
    char **Fcoupe_ch(char *chaine, const char *separateur, unsigned int longeur)
    /*
        Coupe une chaine de caractère en sous chaines après chaque chaine "séparateur" (typiquement " " ou "\n"),
        équivalent de la fonction split des objets chaine en python.
     
        Si longeur vaut 0, la fonction tentera de calculer la longeur de la chaine, sinon on bouclera jusqu'a la longeur donné en argument
     
        Tous les caractères séparateur seront remplacés par le caractère \0, du coup la chaine sera considéré comme plusieurs sous chaine.
        La fonction retournera donc un pointeur vers le début de chaque sous chaine.
     
        Le dernier élement du tableau pos_tableau vaudra NULL ce qui permettra de retrouver la fin du tableau
        Le tableau renvoyé est alloué dynamiquement, penser à libérer la mémoire.
    */
    {
        if (!longeur) longeur = strlen(chaine);
     
        int cpt = 0;
        unsigned int i;
     
        int lg_sep = strlen(separateur);
     
        /* Compte le nombre de lexemes dans la chaine pour allouer la mémoire du tableau de sous chaines */
        int nb_lexemes = Fnb_str(chaine, separateur, longeur) + 2;
     
        /* Le tableau contiendra la position de chaque début de tableau: */
        char **pos_tableau = malloc(nb_lexemes * sizeof(char *));
     
        if (!pos_tableau)
          return pos_tableau;
     
        /* Envoi le pointeur de la première sous chaine dans le tableau. */
        pos_tableau[0] = chaine;
     
        /* Parcours la chaine de char et remplace les espaces par des caractères nul. */
        for (i=0; i<longeur; i++)
        {
            /* Si le caractère courant est le même que le premier de la chaine séparateur... */
            if (chaine[i] == separateur[0])
            {
                if (Fstr_ncompare(&(chaine[i]), separateur, lg_sep))
                {
                    pos_tableau[++cpt] = &chaine[i+lg_sep]; /* ++cpt != cpt++, sinon il saute le premier élément. */
                    chaine[i] = '\0'; /* Remplace le séparateur par le caractère nul pour indique la fin de la sous chaine. */
                    i+=2;
                }
            }
        }
        pos_tableau[cpt+1] = NULL;
        return pos_tableau;
    }
     
    int main(void)
    {
      /* Petit exemple... */
      char test[] = "Ceci est une chaine de caractères !";
      char **chaine_coupe = Fcoupe_ch(test, " ", 0);
      int i = 0;
     
      while(chaine_coupe[i])
        fprintf(stdout, ": \"%s\"\n", chaine_coupe[i++]);
     
      free(chaine_coupe);
     
      return 0;
    }
    Je pense que le code est assez commenté, je sais pas si ça vaut des explications.
    Par contre, moyennant petite adaptation tu pourrais virer l'appel à Fstr_ncompare pour utiliser la fonction standard strcmp à la place.

  8. #8
    Membre confirmé Avatar de tonymx15
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juin 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 140
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    En fait c'est normal tu as mis:

    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* couperTexte(char texte[50], char separateur[10])
    Ça ne marche toujours pas...

    Sinon Diablo j'ai testé tes fonction mais ça n'a pas l'air de marché je detecte plusieurs erreurs.

  9. #9
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Tu pourrais mettre les éventuelles erreurs et ce que ça t'affiche?

  10. #10
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Juste une question, tu as inclus <string.h>?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 38
    Par défaut
    Ca compile en C89 chez moi avec gcc sous Linux.

    Quel sont les erreurs ?

  12. #12
    Membre confirmé Avatar de tonymx15
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juin 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 140
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main.c:29: warning: passing argument 1 of 'fgets' makes pointer from integer without a cast
    main.c:31: warning: passing argument 1 of 'couperTexte' makes pointer from integer without a cast
    main.c:31: warning: format '%d' expects type 'int', but argument 2 has type 'char *'
    main.c:33: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast

  13. #13
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Bah mets le main aussi

  14. #14
    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
    Pour apprendre à utiliser strtok : La fonction strtok.

  15. #15
    Membre confirmé Avatar de tonymx15
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Juin 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 140
    Par défaut
    Merci melem je vais regarder tous ça... Sinon oui j'ai bien inclus la bibliothèque "string.h"

Discussions similaires

  1. [Tableau] Créer une fonction qui retourne un tableau
    Par Imageek dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/01/2009, 16h54
  2. Créer une fonction qui retourne un booléen
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/02/2008, 23h22
  3. Réponses: 2
    Dernier message: 22/10/2007, 17h50
  4. Comment créer une fonction qui retourne un tableau?
    Par Dereck07 dans le forum Delphi
    Réponses: 4
    Dernier message: 26/04/2007, 13h16
  5. [MySQL] Créer une fonction qui récupère un enregistrement
    Par azahord dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/11/2006, 20h13

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