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 :

aide pour chaine en Majuscule


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Par défaut aide pour chaine en Majuscule
    Bonjour,
    voilà, je dois développer une classe ou le constructeur initialise une chaine de caractère. Jusque là aucun problème.

    Le soucis, c'est que je dois convertir cette chaine taper en minuscule, en MAJUSCULE...et là je ne sais pas comment faire. Ma chaine de caractére est stocké dans un const char* machaine....

    JE penses qu'il faut faire avec le code ascii (car en fait il faut enlever 32 au code ascci du caractère en question pour obtenir une majuscule) mais j'avoue ne pas trouver sur se coup là, pourriez vous me donner un coup de main svp ?

    merci

  2. #2
    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 : 51
    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
    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.

  3. #3
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    C'est dans ce genre de situations qu'on apprécie l'en-tête « ctype.h » !
    Il y a pas mal de fonctions C de manipulation de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <cctype>
     
    int toupper(int c);
    int tolower(int c);
    Par contre, ces deux fonctions ne marchent qu'avec les 26 lettres « normales ».

    Comme les autres fonctions de ctype.h, elles prennent en paramètre le code ASCII d'un caractère (typiquement, un unsigned char transtypé en int, ou EOF).
    Elles retournent le code ASCII du caractère transformé en cas de succès, ou celui passé en paramètre en cas d'échec.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Par défaut
    merci pour vos reponses mais en fait je dois faire par une boucle.

    Voici ce que j'ai fait

    for (int c=0;c<size;c++)
    {
    if(chaine[c]>='A'&& chaine[c]<='Z')
    chaine[c]=chaine[c]-32;
    }


    A savoir que chaine est un pointeur char* et size un strlen[chaine]

    le tout passe bien à la compilation mais lors de l'execution ca plante..

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Ce n'est pas étonnant.
    Tu commences par vérifier que le caractère est déjà une majuscule avant d'essayer de le convertir.

    Ce code devrait mieux fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int c = 0; c < size; c++)
    {
        if (chaine[c] >= 'a' && chaine[c] <= 'z')
            chaine[c] -= 32;
    }
    Mais comme dit précédemment, il y a des fonctions standard pour ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <cctype>
     
    (...)
     
    for (int c = 0; c < size; c++)
    {
        chaine[c] = std::toupper(static_cast<unsigned char>( chaine[c] ));
    }
    Ou, encore mieux :
    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
    #include <cctype>    // pour toupper
     
    struct my_toupper
    { 
        char operator()(char c) const 
        {
            return std::toupper(static_cast<unsigned char>(c));
        } 
    };
     
     
    /***************************************/
     
    #include <algorithm> // pour transform
     
     
    std::transform(chaine, chaine + size, chaine, my_toupper());

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Euh là je t'ai mis le code pour un char *.
    Mais en C++, il vaut mieux utiliser les std::string.

  7. #7
    Membre averti Avatar de Saintux
    Homme Profil pro
    Chercheur ( de travail )
    Inscrit en
    Janvier 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur ( de travail )
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 39
    Par défaut
    C'est normal si tu créé ton objet comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CChaine* truc = new CChaine("chaine");
    "chaine" est alors une constante, d'où tu ne peut pas modifier les caractères qui la compose.

    Une solution serait de changer ton constructeur pour faire une copie de la chaine dans un emplacement de mémoire modifiable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CChaine::CChaine(const char* texte)
    {
        chaine = new char[strlen(texte)];
        strcpy(chaine, texte);
        m_size=strlen(chaine);
     
    }
     
    CChaine::~CChaine()
    {
        delete[] chaine;
    }
    PS : L'erreur "windows a cessé de fonctionner" te dis qu'il y a eu une erreur de segmentation ( tentative d'accès à une partie de la mémoire que ton programme n'avais pas à modifier ).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Par défaut Ajout des balises [CODE] (bouton #). Merci d'y penser.
    En fait, le main m'est imposé de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "Chaine.h"
     
    void main()
    {
    	CChaine obj="je fais un test";
    	obj.Show();
    	obj.Upper(); // l'erreur se passe à ce niveau
    	obj.Show();
     
    }

  9. #9
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Ce code me paraît plus correct.
    Il ne faut pas oublier le caractère nul en fin de chaîne !
    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
    #include <cstring>
     
    (...)
     
    CChaine::CChaine(const char* texte)
    {
        m_size = strlen(texte);
        chaine = new char[m_size + 1];
        strcpy(chaine, texte);
    }
     
    CChaine::~CChaine()
    {
        delete[] chaine;
    }
    Pour ce qui est de la conversion, je te conseille encore une fois d'utiliser toupper.

  10. #10
    Membre averti Avatar de Saintux
    Homme Profil pro
    Chercheur ( de travail )
    Inscrit en
    Janvier 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur ( de travail )
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 39
    Par défaut
    En effet, c'est mieux, j'avais fais ça vite

    @elgeek : remplace le constructeur et le destructeur de ta classe par ce que Steph_ng8 a mis, ça résoudra ton problème.

  11. #11
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Ça reste une approche pas très C++, quand même…
    C'est important de savoir manipuler des char*, mais utiliser le standard (donc std::string) c'est mieux.
    À moins d'avoir des besoins très spécifiques et de savoir exactement ce qu'on fait…

    Ici, ça a l'air d'être un exercice, et on t'a peut-être imposé d'utiliser les char*.
    Mais à l'avenir, tourne-toi plutôt vers les std::string.
    Non seulement ça facilite la manipulation des chaînes de caractères, mais en plus ça évite de gérer la mémoire.

  12. #12
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    Par défaut
    Un char * est constant, tu ne peux pas le modifier.
    Pour une chaine de caractère non constant la bonne déclaration est char chaine[taille]!
    Utilise les string, ils prennent en paramètre constructeur des char*.
    Sinon au traitement fait une copie dans un char[m_size], libère l'ancien pointeur, fait le pointer sur le char[m_size].

  13. #13
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Un char * est constant, tu ne peux pas le modifier.
    Ah bon ?
    Depuis quand ?

    Citation Envoyé par Astraya Voir le message
    Pour une chaine de caractère non constant la bonne déclaration est char chaine[taille]!
    Mouais, sauf qu'après on ne peut plus en modifier la taille…

    Je crois que j'ai besoin d'un cours de rattrapage sur les pointeurs.
    Soit T un type donné.
    • T *
    • pointeur simple
    • la valeur du pointeur peut être modifiée
    • les données pointées peuvent être modifiées

    • const T * | T const *
    • pointeur sur une constante
    • la valeur du pointeur peut être modifiée
    • les données pointées ne peuvent pas être modifiées

    • T[] | T * const
    • pointeur constant
    • la valeur du pointeur ne peut pas être modifiée
    • les données pointées peuvent être modifiées

    • const T[] | const T * const | T const * const | (T const [] ?)
    • pointeur constant sur une constante
    • la valeur du pointeur ne peut pas être modifiée
    • les données pointées ne peuvent pas être modifiées


    Où me suis-je trompé ?

    (http://c.developpez.com/faq/?page=po...OINTEURS_const)

  14. #14
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    Par défaut
    Essaye d'éditer un char* sans faire de copie ou allouer une espace mémoire supplémentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main
    {
    char * chaine = "machaine";
    //...
    }

  15. #15
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Un bon compilateur devrait interdire cette syntaxe et t'obliger à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const * chaine ="machaine";

  16. #16
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Essaye d'éditer un char* sans faire de copie ou allouer une espace mémoire supplémentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main
    {
    char * chaine = "machaine";
    //...
    }
    Ah c'est sûr que si tu pars sur les chaînes constantes statiques…
    D'ailleurs, leur type c'est plutôt const char*, non ?

    Citation Envoyé par MatRem Voir le message
    Un bon compilateur devrait interdire cette syntaxe et t'obliger à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const * chaine ="machaine";
    Ah… je me disais, aussi…

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/07/2008, 16h36
  2. aide pour structure et liste chainée
    Par monsieur77 dans le forum C
    Réponses: 8
    Dernier message: 20/11/2007, 17h25
  3. Aide pour chaine en majuscule
    Par jayfaze dans le forum Débuter
    Réponses: 15
    Dernier message: 10/10/2007, 22h31
  4. Réponses: 8
    Dernier message: 23/08/2006, 18h40
  5. Réponses: 15
    Dernier message: 26/03/2006, 12h10

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