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 de gestion de chaine de caractères


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut Problème de gestion de chaine de caractères
    Bonjours,
    je fait un exercice de c++ (je debute alors soyez cool ^^)
    et depuis ce matin 9h je suis dessu et je bloque sur une question ( on pourra pas dire que j'ai pas essayer :p)

    la question est:l'utilisateur entre une chaine de caracteres ( majuscule, minuscule, virgules ou points), et le logiciel lui la restitue sans caractere interdit (chiffres ! ù % * ...) et avec un espace apres chaque points et virgules (sans en rajouter un s'il y est deja) et en retirant les espaces avant les points et virgules
    mon probleme:
    voicie une trace de l'execution:

    Veuillez saisir votre texte
    bonjours1! . bye // ce que j'entre
    bonjours . bye // ce qui s'affiche
    bonjours1! .bye bye bye // ce que j'entre
    bonjours . byebye bye // ce qui s'afiche, on remarque que mon
    espace apres le bye a ete supprimé (il y a eu un decalage)

    comme je bloque deja la dessus g pas encore trouver comment retirer.
    l'espace precedent la virgule ou le point
    please help me :'( ça va biento faire 9h que je suis non stop dessus !

    Si vous vous demander pourquoi j'ai fait le deuxieme :s ba s'était pour essayer de rajouter un espace apres le mot qui suivait mon point (ce qui produirai
    bonjours. bye bye bye
    et non
    bonjours. byebye bye
    Et eu peut etre aussi par ce que je ùme suis emmeler les pinceaux :s une journé de c++ j'ai commencé a fatiguer :p

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Bonjour,
    Je ne suis pas très bon en C++, mais le message paraissait désespéré...
    Il faut d'abord récupérer la variable "unCaractere" et ENSUITE l'utiliser...
    La tester sans l'avoir initialisé (demandé) revient à tester une variable non initailisée.
    Je suis parti du second code.
    "unCarSuiv" reste à supprimer...

    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
    #include <iostream>
    using namespace std;
    int main (){
            unsigned char unCaractere, unCarSuiv, test;
            do
            {
            /* la saisie est DANS la boucle et AVANT d'utiliser la variable */
            cout<<"Veuillez saisir votre texte"<<endl;
            cin >> unCaractere;
            if ((unCaractere==',')||(unCaractere=='.')||(unCaractere==' '))
            {
                if (unCaractere==',')
                    {
                    cout<<", ";
                    test=unCaractere;
                    }
                    else
                        {
                        if (unCaractere=='.')
                        {
                        cout<<". ";
                        test=unCaractere;
                        }
                            else
                                {
                                if (unCaractere==' ' && (test==',' || test=='.'))
                                {
                                cout<<"";
                                test ='1';
                                }
                                    else
                                    {
                                    cout << " ";
                                    }
                                }
                        }
            }
    //deuxieme bloque utile?
       if((unCaractere>='a'&& unCaractere<='z' ) && (test==',' || test=='.'))
            {
            cout<<unCaractere;
            }
            else
                {
                if((unCaractere==' ') && (test==',' || test=='.'))
                {
                cout<<" "<<unCaractere;
                }
                    else
                    {
                    if((unCaractere>='a') && (unCaractere<='z'))
                    {
                    cout<<unCaractere;
                    }
                    else
                        {
                        if((unCaractere==' ') && (test=='1'))
                        {
                        cout<<"";
                        }
                        }
                    }
                }
        }while(unCaractere!='$');
         return 0;
    }

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    please help me :'( ça va biento faire 9h que je suis non stop dessus !
    -> Pas de commentaires ?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je n'ai pas lu en détails ton algorithme, car j'ai l'impression qu'il est un peu vicié, à moins que ton énoncé ne soit pas complet. Tu travailles en effet caractère par caractère, avec éventuellement un second en mémoire. D'après ce que j'ai compris, tu as les contraintes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "un        chat"  -> "un        chat"
    "un       ,chat" -> "un, chat"
    Si tel est le cas, tu a besoin d'avancer d'un nombre arbitraire de caractères pour savoir quoi faire.

    Ensuite, tes tests pour savoir si un caractère est autorisé ne sont pas corrects. Rien ne garanti en C++ que le codage de 'b' soit entre celui de 'a' et de 'z'. De plus, ton système de prend pas en compte les accents.

    Je vois deux façons de faire :
    1/ A la main :
    Tu crée une liste de tous les caractrèes autorisés, et tu vérifie s'il est dedans. Un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Init
    char* allowedCharBuilder = "abcdefghijk...ABCDE...éèàç...";
    std::set<char>allowedChar(allowedCharBuilder, allowedCharBuilder+sizeof(allowedCharBuilder));
    // Utilisation
    if (allowedCharBuilder.count(c) != 0) // autorisé
    2/ En utilisant ce qui est fait pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    locale loc ( "French_France" ); // Défini la langue utilisée pour déterminer ce qui est accent et ne l'est pas
    if (isalpha(c, loc)) // autorisé
    Enfin, pour le problème des espaces à gérer, perso je partirais sur l'écriture d'un automate d'état, qui interviendrait après la suppression des caractères interdits, et aurait les états suivants :
    - Dans un mot
    - Après un mot
    - Après une ponctuation

    Les actions à faire dans chaque état en fonction de la catégorie du caractère entrant sont plus simples à exprimer que si tu dois gérer tous les cas d'un bloc.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    Merci de vos reponses
    J'avous ne pas trés bien avoir compris ce que vous avez essayé de me dire,
    Que veut tu dire par
    Il faut d'abord récupérer la variable "unCaractere" et ENSUITE l'utiliser...
    Et
    "unCarSuiv" reste à supprimer...
    J'ai essayé ce que tu tu as fait, ça met plein de retour chario entre chacun de mes caracteres, et eu.. JolyLoic , je debute en C++ ^^
    J'avou n'avoir compris aucune comandes de ton code :s :s

    // Init
    char* allowedCharBuilder = "abcdefghijk...ABCDE...éèàç...";
    std::set<char>allowedChar(allowedCharBuilder, allowedCharBuilder+sizeof(allowedCharBuilder));
    // Utilisation
    if (allowedCharBuilder.count(c) != 0) // autorisé
    Ceci etant un exercice, et que nous avons commencé le C++ il y a 15 jours apeine, il devrai m'etre possible de realise rmon programme avec des, IF, ELSE, Cin.get, Cou , While ..
    Enfin les truc de base ^^

  6. #6
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Prenons les choses dans l'ordre

    1)
    Il faut d'abord récupérer la variable "unCaractere" et ENSUITE l'utiliser...
    Dans l'algo 2; tu utilisais la variable "unCaractere" avant de l'avoir demandé au clavier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main (){
            char unCaractere, unCarSuiv, test;
            cout<<"Veuillez saisir votre texte"<<endl;
            do
            {
            if ((unCaractere==',')||(unCaractere=='.')||(unCaractere==' '))
            {
    Là, lorsque le code se déroule la première fois, dans le "if" la variable est testée (3 fois!) alors qu'elle n'a pas encore de valeur.

    2)
    "unCarSuiv" reste à supprimer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            unsigned char unCaractere, test;
            /*unsigned char unCaractere, unCarSuiv, test;*/
    Chez moi cela fonctionne sans souci.
    Avec une variable qui ne sert à rien, le programme fonctionne parfaitement, mais lors d'une relecture, on se pose des questions. C'est juste une question de visiblité.

    3)
    J'ai essayé ce que tu tu as fait, ça met plein de retour chario entre chacun de mes caracteres
    Attention, comme indiqué, j'ai (pour ma part) juste fait la correction pour que l'on puisse utiliser la variable que lorsqu'elle est initialisée. C'est tout.

    4) Au niveau découpe d'une chaine, il existe ceci dans la FAQ:
    http://cpp.developpez.com/faq/cpp/?p...#STRING_tokens

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4
    Par défaut
    Merci a tous pour vos reponse, probleme resolu, je posterai la reponse demain soir apres l'avoir rendu (on sait jammais si quelqu'un venais tout copier pour rendre mon programme :p )

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/05/2006, 15h23
  2. Réponses: 2
    Dernier message: 23/03/2006, 12h39
  3. Réponses: 11
    Dernier message: 22/03/2006, 21h57
  4. [vb excel]Gestion de chaine de caractère et de fichier
    Par shirya dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2005, 09h58
  5. Réponses: 4
    Dernier message: 20/08/2004, 10h59

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