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 :

[FAQ] convertir une chaîne en majuscule


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut [FAQ] convertir une chaîne en majuscule
    Bonjour,

    j'ai essayé d'implémenter cette faq. Cela consiste à convertir une chaîne de caractères en majuscule.

    Voici mon code (c'est le même que la faq):

    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 <algorithm>
    #include <cctype>
    #include <string>
    //...
     
    struct ps_toupper
    { 
        char operator()(char c) const 
        {
            return std::toupper(static_cast<unsigned char>(c));
        } 
    };
     
    std::string UpperCase(std::string str) 
    {
        return std::transform(str.begin(), str.end(), str.begin(), ps_toupper()); // erreur ici
    }
    Et ça ne compile pas. J'obtiens une erreur sur la ligne "std::transform". L'erreur est la suivante:
    c:\dev\tests\dumcpp\cconfigreader.cpp(157) : error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)' : cannot convert parameter 1 from 'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
    with
    [
    _Elem=char,
    _Traits=std::char_traits<char>,
    _Ax=std::allocator<char>
    ]
    and
    [
    _Elem=char,
    _Traits=std::char_traits<char>,
    _Alloc=std::allocator<char>
    ]
    and
    [
    _Elem=char,
    _Traits=std::char_traits<char>,
    _Ax=std::allocator<char>
    ]
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    Je suis sous Visual Studio 2005 (donc Windows).

    Je n'ai pas encore cherché d'où vient le problème, je tenais d'abord à vous en faire part.

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    sous linux ca marche bien :p

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    std::transform ne renvoie pas la chaîne, mais un itérateur sur le dernier élement traité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::string UpperCase(std::string str) 
    {
        std::transform(str.begin(), str.end(), str.begin(), ps_toupper());
        return str;
    }

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut



  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Convertir une chaîne en majuscules est une opération assez compliquée, voir sur le site d'Unicode.
    Le code fourni ne marchera qu'avec certains charset mono-byte et certains langages.

    En effet :
    - il faut d'importantes tables pour savoir quel est le caractère correspondant
    - certaines transformations ne sont pas 1:1, par exemple ß qui devient SS en majuscules
    - dans certaines langues, le contexte est nécessaire. Par exemple Σ se met en minuscule de manière différente s'il est au début σ ou à la fin du mot ς. J'imagine qu'il y aussi le même genre de chose pour l'autre sens.

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Oui je sais bien (mais tu fais bien de le rappeler), mais dans mon cas, il s'agit de lire un fichier trés spécifique, en anglais, dans lequel je sais qu'il n'y aura aucun caractère spécial, aucune ponctuation, aucun accent, etc.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par loufoque
    Convertir une chaîne en majuscules est une opération assez compliquée, voir sur le site d'Unicode.
    Le code fourni ne marchera qu'avec certains charset mono-byte et certains langages.

    En effet :
    - il faut d'importantes tables pour savoir quel est le caractère correspondant
    - certaines transformations ne sont pas 1:1, par exemple ß qui devient SS en majuscules
    - dans certaines langues, le contexte est nécessaire. Par exemple Σ se met en minuscule de manière différente s'il est au début σ ou à la fin du mot ς. J'imagine qu'il y aussi le même genre de chose pour l'autre sens.
    C'est très exactement ce que l'on explique en détail dans la Q/R de la FAQ dont est inspirée cette discution

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/09/2006, 13h42
  2. Convertir une chaîne binaire en signal carré
    Par hotdog dans le forum Signal
    Réponses: 1
    Dernier message: 06/09/2006, 10h01
  3. Convertir une chaîne utf8 en iso-8859-1
    Par dredre dans le forum ASP
    Réponses: 1
    Dernier message: 05/05/2006, 00h48
  4. Convertir une chaîne en date
    Par davinout dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2006, 19h35
  5. Réponses: 3
    Dernier message: 28/09/2003, 10h46

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