Informatica stringa
Ho questa funzione string upcase (string s) {
devo convertire i caratteri di s in maiuscolo qualcuno mi puo aiutare.. Grazie
devo convertire i caratteri di s in maiuscolo qualcuno mi puo aiutare.. Grazie
Risposte
In che linguaggio?
Stai usando il C++?
In quel caso il metodo corretto e standard di farlo è usare la funzione toupper definita in cctype. Il pensare che tutti i sistemi usino l'ASCII, come fanno generalmente i professori, è un errore comune ma piuttosto grave. Soprattutto se il tuo scopo è la portabilità.
Detto questo toupper potrebbe essere definito come una MACRO il che lo rende difficile da usare all'interno di particolari algoritmi come transform, for_each e cose simili. Ma tanto non li potresti usare comunque
.
In quel caso il metodo corretto e standard di farlo è usare la funzione toupper definita in cctype. Il pensare che tutti i sistemi usino l'ASCII, come fanno generalmente i professori, è un errore comune ma piuttosto grave. Soprattutto se il tuo scopo è la portabilità.
Detto questo toupper potrebbe essere definito come una MACRO il che lo rende difficile da usare all'interno di particolari algoritmi come transform, for_each e cose simili. Ma tanto non li potresti usare comunque

in c++ con il metodo ascii
Come dice vict85*, il modo corretto sarebbe usare std::toupper (anche se i parametri sono int).
Implementare una versione che funzioni su sistemi che usano ASCII non è complicato. Innanzitutto un carattere è fondamentalmente un numero intero.
Alcune funzioni (es. printf, o gli operatori sugli stream std::cout) e il compilatore interpretano questi valori come caratteri. Sui sistemi che usano ASCII, si ha questa corrispondenza:
Quindi il numero 65 è equivalente al carattere 'A':
Il fatto che alle lettere siano associati valori contigui e crescenti ti permette di passare facilmente da maiuscolo a minuscolo.
Quindi, aggiungendo 32 ad una lettera maiuscola ottieni la corrispondente lettera minuscola. Sottraendo 32 ad una lettera minuscola ottieni la corrispondente lettera maiuscola.
Puoi anche scrivere ('a' - 'A' ) al posto di 32.
Quindi una funzione toupper potrebbe essere implementata così:
Comunque questo è un sistema che potenzialmente NON funziona su sistemi che non usano ASCII. La funzione std::toupper invece funziona correttamente.
* In C++, includendo, "toupper" dovrebbe essere definita nel namespace "std", quindi non può essere definita come macro (non sono al 100% sicuro, ma una breve ricerca su internet ha rafforzato la mia opinione).
Implementare una versione che funzioni su sistemi che usano ASCII non è complicato. Innanzitutto un carattere è fondamentalmente un numero intero.
char a = 65;
Alcune funzioni (es. printf, o gli operatori sugli stream std::cout) e il compilatore interpretano questi valori come caratteri. Sui sistemi che usano ASCII, si ha questa corrispondenza:
... 65 => 'A' 66 => 'B' 67 => 'C' 68 => 'D' 69 => 'E' 70 => 'F' 71 => 'G' 72 => 'H' 73 => 'I' 74 => 'J' 75 => 'K' 76 => 'L' 77 => 'M' 78 => 'N' 79 => 'O' 80 => 'P' 81 => 'Q' 82 => 'R' 83 => 'S' ... 97 => 'a' 98 => 'b' 99 => 'c' 100 => 'd' 101 => 'e' 102 => 'f' 103 => 'g' 104 => 'h' 105 => 'i' 106 => 'j' 107 => 'k' 108 => 'l' 109 => 'm' 110 => 'n' 111 => 'o' 112 => 'p' ...
Quindi il numero 65 è equivalente al carattere 'A':
char a = 65, b = 'A'; // a == b
Il fatto che alle lettere siano associati valori contigui e crescenti ti permette di passare facilmente da maiuscolo a minuscolo.
'a' = 97 - 'A' = 65 = ------------ 32
Quindi, aggiungendo 32 ad una lettera maiuscola ottieni la corrispondente lettera minuscola. Sottraendo 32 ad una lettera minuscola ottieni la corrispondente lettera maiuscola.
Puoi anche scrivere ('a' - 'A' ) al posto di 32.
Quindi una funzione toupper potrebbe essere implementata così:
char toupper(char l) { if ('a' <= l && l <= 'z') { // l è una lettera minuscola l = l - ('a' - 'A'); } return l; }
Comunque questo è un sistema che potenzialmente NON funziona su sistemi che non usano ASCII. La funzione std::toupper invece funziona correttamente.
* In C++, includendo