Newsgroup: it.comp.lang.c++
Titolo: [?] rendere le lettere minuascole

Salve a tutti.
C'è una funzione della libreria standard del c++ che permette di rendere
minuscole le lettere di un array di caratteri? E cosa devo usare per
eseguire la stessa operazione su un oggetto della classe string della
libreria standard?
Grazie anticipatamente,
Salvo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Salvo
Sia per l'array di caratteri che per la classe string usi tolower:
 #include <ctype.h>
...
std::string s = "HELLO";
for (unsigned int  i=0;i<s.length();++i)
    s[i]  = tolower(s[i])); //std C
Andrea

 ha
scritto:

grazie mille!


     s[i]  = tolower(s[i])); //std C
Che ha un comportemente indefinito su molti systemi (tutti dove char è
signed).
Il megliore, si ha una biblioteca un po attualle sarebbe :
    std::use_facet< std::ctype< char > >( locale() )
        .tolower( s, s + strlen( s ) ) ;
Per sfortuna, non funczionne che sulle catene tipo C. Allora, qualcosa
come :
    class ToLower
    {
    public:
        ToLower( std::locale const& l = std::locale() )
            :   myCType( &std::use_locale< std::ctype< char > >( l ) )
        {
        }
        char                operator( char ch ) const
        {
            return myCType->tolower( ch ) ;
        }
    private:
        std::ctype< char > const*
                            myCType ;
    } ;
    std::transform( s.begin(), s.end(), s.begin(), ToLower() ) ;
Si hà una vecchia biblioteca, dove <locale> non funczionne bene, bisogna
fare :
    struct ToLower
    {
        char                operator( char ch ) const
        {
            return tolower( static_cast< unsigned char >( ch ) ) ;
        }
    } ;
    std::transform( s.begin(), s.end(), s.begin(), ToLower() ) ;
Infine, sai anche che non funzionne per tutte le lingue. In generale, un
caractere minuscolo può dare più d'un caractere maiuscolo (in tedesco,
"ß" dà "SS"), o vice versa. O che la conversione è ambiguà (in francese,
certi convenzionni danno "E" per "e", "é", "è" ed "ê").
--
James Kanze           GABI Software         
http://www.gabi-soft.fr
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

certi convenzionni danno "E" per "e", "é", "è" ed "ê").
credevo si trattasse di un'operazione semplice semplice....
grazie per la completa risposta. in ogni caso, a causa della mia
ancora scarsa conoscenza del c++ non ho capito alcune parti del codice
che hai postato.
comunque grazie ancora.

 che hai postato.
Qualli parti? 
Mi son servito delle funzioni standard. Nel primo essempio, ho utilizato
le funzioni di localizazione -- son infatto abbastanza complicate
(troppo seguendo me). Negli altri essempi mi son servito de
std::transform -- lei invece non è così difficile.
In ogni caso, c'è una cosà essenziale a ritenir: la funzione tolower con
un solo parametro non prende un char comme parametro. Prendi un int con
una valore fra 0 e UCHAR_MAX (o EOF). E le dare un char direttamento non
funzione, perchè char è spesso signed, e la funzione non và colle valori
negative. Per quello bisogna convertire primo in unsigned char. Dunque,
anche con il for proposto primo, bisogna fare:
    for ( size_t i = 0 ; i < s.size() ; ++ i ) {
        s[ i ] = tolower( (unsigned char)( s[ i ] ) ) ;


 wrote in message
news:82Z84Z35Z32Y10...@usenet.libero.it...
