View Full Version : [C++] uppercase - conversione da lettere minuscole a maiuscole
mistergks
31-03-2011, 01:09
Uno dei mie tanti dubbi:
Ho un array con una serie di lettere minuscole.. vorrei creare una funzione che converta tutte le lettere minuscole in maiuscolo..
Avevo pensato a uno switch in cui mettere tutte le lettere dell'alfabeto e nel caso in cui la funzione trova quella lettera sarà presente in uno dei case dello switch e all'interno di questo case sarà presente uno scambio cosi ad esempio:
for(int i=0; array[i]!='\0'; i++){
switch(array[i]){
case 'a': array[i]='A';
break;
case 'b': array[i]='B';
break;
...
...
//e cosi' via....
}//switch
}//for
E' giusto questo algoritmo? C'è un ragionamento migliore e magari piu' efficiente?
tomminno
31-03-2011, 01:12
std::transform(text.begin(), text.end(), text.begin(), std::toupper);
Altrimenti giochi con la rappresentazione numerica del char sottraendogli una costante (controlla l'ascii table).
Altrimenti giochi con la rappresentazione numerica del char sottraendogli una costante (controlla l'ascii table).
Io farei così! ;) ovviamente funziona se hai del testo ASCII 8bit..se hai UDF prova la funzione transform postata da tomminno!
Ancora meglio se giocate con i bit :D.
Praticamente tra lettere minuscole e maiuscole cambia solo il 6° bit (contando da destra) :D.
mistergks
31-03-2011, 15:55
ma a me serve un modo un pò piu' efficiente ma sempre molto elementare!! dato che mi sto preparando per un esame di fondamenti! Quindi niente funzioni pronte e niente librerie!
L'algoritmo e' corretto. Cambia l'implementazione!
Nel senso che in un caso (il tuo) effettui il tutto a mano mentre
in quello di tomminno fai fare il lavoro alla libreria (che fara' in modo sicuramente piu' ottimizzato il ragionamento che hai fatto tu).
Anche la sostituzione 'aritmetica' del carattere ascii e' una strada, ma la puoi applicare anche utilizzando le funzioni di conversione del C.
---(p.e.)--------
int i=0;
while(array[i])
{
if (isalpha(array[i]))
array[i]=toupper(array[i]);
i++;
}
--------
Ciao
Ancora meglio se giocate con i bit :D.
Praticamente tra lettere minuscole e maiuscole cambia solo il 6° bit (contando da destra) :D.
In effetti la differenza è 32, non ci avevo mai pensato. :D
mistergks
31-03-2011, 17:03
cioè?! come si gioca con i bit??!:muro:
cioè?! come si gioca con i bit??!:muro:
Usando gli operatori bitwise, & (and), | (or), ^ (xor) e ~ (not).
char bits
'a' 110 0001
'A' 100 0001
Per passare da 'a' a 'A' dunque devi disattivare il bit numero 6.
Sapendo che sono tutte potenze di 2 basta calcolare 2^5 (perché si parte da 0) che fa 32 come detto correttamente da GByte.
Dunque:
int bits
32 010 0000
~32 101 1111
char bits
'a' 110 0001 AND
~32 101 1111 =
-----------------
'A' 100 0001
Una soluzione potrebbe essere dunque:
char little = 'a';
char big = little & ~32; // disattivi il 6° bit
Supponendo di volere fare l'operazione inversa (da grande a piccolo):
char big = 'A';
char little = big | 32; // attivi il 6° bit
Puoi usare anche lo XOR, che ti consente di uniformare i due operatori, comportandosi da "interruttore":
'a' ^ 32 => 'A'
'A' ^ 32 => 'a'
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.