Informatica stringa

tony.951
Ho questa funzione string upcase (string s) {
devo convertire i caratteri di s in maiuscolo qualcuno mi puo aiutare.. Grazie

Risposte
claudio862
In che linguaggio?

vict85
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 :roll: .

tony.951
in c++ con il metodo ascii

claudio862
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.

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 , "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).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.