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 :

Manipulation des chaines de caractères en c


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut Manipulation des chaines de caractères en c
    Bonjour
    Je souhaite récupérer des mots à partir d'une chaine saisie au clavier, suivant un critère bien défini, ensuite, pouvoir les afficher ou les garder dans un fichier par exemple:
    la chaine saisie: select aaaa,bbbb from tab;
    les mots que je doit chercher seront, ceux séparé par les vrgules, ou avant from: aaaa et bbbb

    S'il vous plait, si vous pouvez m'aider à résoudre le problème, voici mon code, et 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
     
    #include<stdio.h>
    #include<conio.h>
    void main()// nbreAttribut()
    {
         int i,v=0,nbr;
         char ch[100], att[40];
         //char from[4]={'f','r','o','m'};
         clrscr();
     
         //tab de chaine de caractére pour rassembler les attributs
         printf("\n\tsasir la requete\n\t");
         scanf("%s",&ch);
     
         for(i=0;i<strlen(ch);i++) {
              do{
                  v=(v+1)/2;
              }while(ch[i]==','/*ou ==from*/);
     
               //if (ch[i]==',') att=gets(ch);printf("%s",&att);fflush(att);
         }
     
         printf("nbre attributr=  %d\t",v);
         getch();
    }

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je vois une facon pas trop difficile de resoudre ton probleme il te suffirait de parser se qui arrive dans l'entree standard pour calculer la taille du malloc a effectuer puis malloc un char **.
    Une fois que cela a ete effectuer tu pourras commencer a copier ce qui t'interesse petit a petit dans ton char **.

    En details :
    - Pour recuperer ce qu'il sort de l'entree standart un simple read de 0 avec verification des valeurs de retour fera l'affaire.
    - Pense aussi quand travaillant avec l'entree standard tu pourra lire qu'une seul fois, alors faire une premiere copie de ce que tu lit dans un char ** ou char *(man strdup t'aidera).
    - Et pour finir un fois que tu a finie avec l'entree standard il te restera juste a retravailler le char simple ou double etoile que tu aura en memoire et le tour sera jouer.


    Bonne Chance

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Merci, je vais essayer de le faire.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pour récupérer la saisie utilise plutôt la fonction fgets ce qui te donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ((fgets (ch, 100, stdin)) != NULL)
    {
       /* Ton code ici... */
    }

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ce que je ferais, ici sans vérification aucune de la bonne saisie des mots clé comme select serait de récupérer un pointeur sur le début de la sous-chaîne, ici select avec la fonction strstr puis je déplacerais le pointeur de 6 cases pour donc arriver au t de select puis je commencerais ma boucle.

    Dans la boucle, tant qu'il y'a des espaces tu la continue sans autre actions et dès que tu tombes sur un caractère autre que espace, tu commences à stocker jusqu'à tomber sur le caractère de séparation

    Il va de soi qu'il est préférable d'utiliser une tableau de chaînes de caractères pour bien séparer les différents mot que tu veux récupérer

  6. #6
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Je suis débutante en c, mais j'essaye de faire de mon mieux, alors si j'ai bien compris c'est ça ce que vous voulez dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    printf("\n\tsasir la requete\n\t");
    req=gets(ch);
    for(i=6;i<strlen(req);i++) {
    if(ch[i]!=' ' && ch[i]!=','){
    gets(attr);
    scanf(attr);
    }
    mais, lorsque j'exécute, ça se bloque.

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Est-ce que j'ai parlé de gets ? Non, j'ai parlé de fgets ! Il faut lire un peu ce qu'on marque et d'ailleurs si tu as un compilateur qui respecte les vraies normes du C (pas un compilateur Microsoft entre autre qui est réputé pour ne pas les respecter ou du moins en partie), il t'aurais dit lors de la compilation que gets est une fonction dangereuse et qu'il faut donc par conséquent ne pas l'utiliser !


    Ce que j'avais en tête était quelque chose du genre:
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
     
    #define BUFFER_SIZE 100
    #define STRING_SIZE 10
     
     
    int main (void)
    {
       char buf [BUFFER_SIZE] = { 0 };
       char tab [2][STRING_SIZE] = { { 0 } };
       int i = 0;
       int j = 0;
     
     
       printf ("Entrez votre requete: ");
       fflush (stdout);
     
       if ((fgets (buf, BUFFER_SIZE, stdin)) != NULL)
       {
          char * p = strstr (buf, "select");
     
          if (p != NULL)
          {
             p += strlen ("select");
     
             while (*p++ != '\n')
             {
                if (isspace (*p))
                {
                   continue;
                }
                else
                {
                   if (*p == ',')
                   {
                      i++;
                      j = 0;
                   }
                   else
                   {
                      tab [i][j] = *p;
                      j++;
                   }
                }
             }
          }
       }
     
     
       i = j = 0;
       for (i = 0; i < 2; i++)
       {
          printf ("%s\n", tab[i]);
       }
     
     
       return EXIT_SUCCESS;
    }
    Attention, c'est fait un peu à la va-vite mais ca marche, sauf que je ne fait pas de teste pour vérifier si on tombe sur le mot cle from par exemple. Les tests effectués sont faits ansi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Entrez votre requete: select aaaa, bbbb
    aaaa
    bbbb
     
    Press ENTER to continue.

    Voilà, reste qu'a paufiner et améliorer

  8. #8
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 254
    Points : 80
    Points
    80
    Par défaut
    Merci beaucoup...

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par developppez
    Merci beaucoup...
    Y'a pas de quoi mais il faut que tu complète le code de toutes manières suivant tes besoins et je te suggère de vraiment approfondir tes connaissances en C donc de lire des cours Le C ne se programme pas au hasard, il faut que tu saches ce que tu fait !

Discussions similaires

  1. Manipulation des chaines de caractères
    Par Chris L' Arabis dans le forum Langage
    Réponses: 5
    Dernier message: 11/06/2014, 17h31
  2. [WD17] Manipuler des chaines de caractères Arabe
    Par nouyanouya dans le forum WinDev
    Réponses: 7
    Dernier message: 22/11/2013, 12h35
  3. Manipulation des chaines de caractères
    Par Dominique49 dans le forum Langage
    Réponses: 2
    Dernier message: 05/10/2011, 00h05
  4. Manipuler des chaines de caractères
    Par niuniuk36 dans le forum SQL
    Réponses: 4
    Dernier message: 15/08/2011, 12h31
  5. Manipulation des chaines : supprimer certains caractères
    Par pierrepo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/11/2009, 21h25

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