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 :

Organiser mes strchr()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut Organiser mes strchr()
    Bonsoir à tous:

    Voilà j ai ecrit ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ((strchr(mot, caractereUn) && strchr(mot, caractereDeux) && strchr(mot, caractereTrois)) != NULL)
      {
     
       printf("%s\n", mot);
       fputs(mot, fichier2);
       compteur++;
      }
    Ce que je fait avec ce petit bout de code c est que si les 3 lettres (caractereUn, caractereDeux, caractereTrois) sont dans "mot" j affiche le mot trouvé dans la console et je l ecrit dans un fichier texte. (le mot trouvé viens d un autre fichier texte).

    Je souhaiterais egalement faire ceci avec ce bout de code :

    Disons que si caractereUn est un 's',
    que si caractereDeux est un 'l'
    et que si caractereTrois est un 't'

    il faudrait que pendant la recherche des mots dans le fichier texte de depart je ne sorte seulement les mots ayant les lettres s , l ,t dans l ordre du sens de la lecture , c est à dire que le mot "resultat" il me l affiche et le met dans le fichier texte de stockage des mots trouvés , mais le mot "toulouse" il le passe puisque les lettres ne sont pas dans le bon ordre.

    J avais pensé a rajouter ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ((strchr(mot, caractereUn) && strchr(mot, caractereDeux) && strchr(mot, caractereTrois)) != NULL)
     
      {
        if((caractereUn < caractereDeux) && (caractereDeux < caractereTrois))
         {
       printf("%s\n", mot);
       fputs(mot, fichier2);
       compteur++;
         }
      }
    Mais ca ne marche pas.

    Est-ce que quelqu un (sans me donner la reponse ) pourrait me donnait une petite piste ou me dire si il existe une fontion qui existe déjà ou peut etre faut il cree cette fonction moi meme pour arriver a mes fins.

    Merci par avance.

    Shaz

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Pas la réponse, juste une piste? Ok cest bien si tu veux travailler...
    Perso j'ai pas la réponse.
    Chez moi ce simple programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    #include <string.h>
    int main(void){
      char mot[]="resultat";
      char c1='r',c2='t',c3='l';
      if ((strchr(mot, c1) && strchr(mot, c2) && strchr(mot, c3)) !=NULL)
      {
       printf("%s\n", mot);
     
      }
      return 0;
    }
    Compile et m'affiche "resultat" à l'écran.
    On peut remarquer que ton "!=NULL" est inutile ici, et est meme sujet à confusion.
    Que retourne strchr ? un pointeur vers un caractere de la chaine, ok. Que retourne une expression avec des "&&" ? 0 ou 1, selon que les valeurs dans l'expression sont égales 0 ou différentes de 0. Par exemple, "415 && NULL" retourne 0.
    Donc on fait tu compares 0 ou 1, dans ton test, avec NULL . Ca marche car NULL est une constante qui vaut 0, mais bon, à mon avis tu pensais pas que c'était ca qui se passait.
    Oulala je mexprime mal. Tas compris quelque chose? J'espère que je dis pas de bêtise non plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((caractereUn < caractereDeux) && (caractereDeux < caractereTrois))
    Qu'espères tu tester avec ca ???
    Rien à voir avec ce que tu veux faire !!!

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonsoir Climoo

    Merci de me repondre

    Effectivement tu as raison , si j enléve != NULL ca me donne la même chose et en plus comme tu dis c est pas excellent. C est vrai que j ai du mal à suivre mais bon etant donné que je suis debutant en C , de toute maniere j ai un long chemin à parcourir avant d etre au top moi meme.

    J ai oublié d afficher dans mon premier message ceci :

    if((caractereUn < caractereDeux) && (caractereDeux < caractereTrois) != NULL)

    Je pensais que ca aller mettre un ordre entre les caracteres. Mais bon.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonsoir pierre.z

    Merci pour ta reponse. je vais voir de suite ceci.

    Shaz

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Par défaut
    En attendant, je suis en train de faire le programme.
    Si tu as besoin de plus d'aide, je suis dispo'

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    J ai essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     char *suiteChaine = NULL;
        char mot[]="resultat";
      char c1='l',c2='r',c3='t';
      if ((strchr(mot, c1) && strchr(mot, c2) && strchr(mot, c3)))
      {
       suiteChaine = strchr(mot, c1);
       if (suiteChaine != NULL)
      {
       printf("%s\n", mot);
      }
      }
    Pour l instant ca ne donne pas ce que je veux.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Je n ai rien contre un petit coup de main effectivement, je cherche aussi.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Par défaut
    Si tu fait : "suite = strchr(mot, 's');", la chaine "suite" contiendra la suite de ta chaine "mot" en partant du caractère recherché. Il te suffit juste de faire après : "strchr(suite, 'l')" pour chercher le caractère 'l' en partant du 's' que tu as recherché précédemment. Maintenant à toi d'en faire un programme c

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par shazad Voir le message
    Est-ce que quelqu un (sans me donner la reponse ) pourrait me donnait une petite piste ou me dire si il existe une fontion qui existe déjà ou peut etre faut il cree cette fonction moi meme pour arriver a mes fins.
    C'est pas strpbrk() que tu veux ?

    EDIT : Si ce sont des lettres dans des mots différents, ça n'ira pas. Il faut effectivement appeler plusieurs fois strchr() comme l'a montré Medinoc.

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    j ai essayer le nouveau code de Medinoc comme 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
     char mot ="resultat";
             char caractereUn = 'r', caractereDeux = 'l', caractereTrois = 't';
            char const * pc1 = ((mot != NULL) ? strchr(mot, caractereUn) : NULL); /*cherche c1 dans la chaîne */
    	char const * pc2 = ((pc1 != NULL) ? strchr(pc1, caractereDeux) : NULL); /*si trouvé, cherche c2 après c1*/
    	char const * pc3 = ((pc2 != NULL) ? strchr(pc2, caractereTrois) : NULL); /*si trouvé, cherche c3 après c2*/
    	int bRetour = (pc3 != NULL);
                                     /*si trouvé, retourne une valeur non-nulle.*/
         if( bRetour != NULL) 
     
       {
       printf("%s\n", mot);
     
     
        }
    Je me retrouve avec une erreur de segmentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /bin/sh: line 1: 10832 Erreur de segmentation  /home/shazad/jeu/debug/./src/jeu
    Appuyez sur la touche « Entrée » pour continuer !

  11. #11
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char mot ="resultat";
    Huuh? Pas un petit problème dans cette ligne? resultat : chaine de caractère.
    mot : un caractère simple.
    Tu devrais meme avoir un warning à la compil...
    lol on a pas fini si tu rajoutes des erreurs au fur et à mesure Brave débutant , tu es perséverant...

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Étoile manquante.

    Si ton compilateur ne te donne pas au moins un warning là-dessus, c'est qu'il est mal réglé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Je suis desolé, effectivement ca marche mieux comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     char mot[] ="resultat";
             char caractereUn = 'r', caractereDeux = 'l', caractereTrois = 't';
            char const * pc1 = ((mot != NULL) ? strchr(mot, caractereUn) : NULL); /*cherche c1 dans la chaîne */
    	char const * pc2 = ((pc1 != NULL) ? strchr(pc1, caractereDeux) : NULL); /*si trouvé, cherche c2 après c1*/
    	char const * pc3 = ((pc2 != NULL) ? strchr(pc2, caractereTrois) : NULL); /*si trouvé, cherche c3 après c2*/
    	int bRetour = (pc3 != NULL);
                                     /*si trouvé, retourne une valeur non-nulle.*/
         if( bRetour != NULL) 
     
       {
       printf("%s\n", mot);
     
     
        }
    Et mon compilateur me marque le mesage à la ligne (if(bRetour != NULL)) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     /home/shazad/jeu/src/jeu.c:42: warning: comparison between pointer and integer
    Mais n empeche que le code fonctionne.

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Merci Medinoc tous fonctionne tres bien dans le code pour lequel je voulais cette fonction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel layout pour organiser mes boutons dans une JFrame ?
    Par zangaloni dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 31/03/2009, 16h44
  2. Organiser mes classes
    Par TheBlackReverand dans le forum C#
    Réponses: 2
    Dernier message: 10/02/2008, 15h20
  3. [VB.Net 2.0] Comment organiser mes classes ?
    Par arno2000 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 26/06/2006, 15h28
  4. Comment organiser mes partitions
    Par Celelibi dans le forum Administration système
    Réponses: 8
    Dernier message: 14/11/2005, 10h09
  5. [tomcat + eclipse + applet] organiser mes sources
    Par dzincou dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 10/03/2005, 16h40

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