Newsgroup: it.comp.lang.c
Titolo: Convertire lettera in maiuscolo in C

Per convertire un carattere da minuscolo in maiuscolo, non ï¿œ sufficiente 
questo codice?
 
 
     char lettera='e';
     lettera= toupper(lettera);// converto il carattere
 
 
 
Sul un libro di programmazione ho trovato una variante del codice. Prima 
controlla il carattere e se ï¿œ minuscolo lo converte in maiuscolo.
Perchï¿œ fare questa verifica? Se converto in maiuscolo senza tener conto 
del dato di ingresso, cosa succede? Se in ingresso mi trovo un carattere 
giï¿œ in maiuscolo non dovrebbe dare dare nessun problema?
 
 
 
    char lettera='e';
      if (islower (lettera)) // verifico che il carattere sia minuscolo
         {
         lettera= toupper(lettera);// converto il carattere
         }
 
 
 
ciao
nero23

 nero23
 
 
 
 
 
Lo  standard ANSI dice chiaramente che se il parametro passato non è una 
lettera minuscola allora viene passato in uscita invariato quindi l' if 
è inutile
Certo le cose potrebbero cambiare  se la libreria C non fosse ANSI
 

 
 
basta il toupper() senza alcun if.
 
Ciao!

 Perchè fare questa verifica? 
 
Per perdere tempo. AFAIR toupper è implementata così:
 
int toupper(int c)
  {  
    if (islower(c))  return c+'A'-'a'; 
  }
 
 


Se la codifica è ASCII, se fosse EBCDIC l' algoritmo cambia
Inoltre è assente l' else
 
return islower(c) ? c+'A'-'a' : c;
 

 return islower(c) ? c+'A'-'a' : c;
 
AFAIR. Si vede che I remember no buono. Che vuoi? Erano le 
due di notte ed ero preda dell'insonnia da peperoni imbottiti!
 
 
 

 due di notte ed ero preda dell'insonnia da peperoni imbottiti!
 
Oggi sei il secondo che me ne parla.
 
/mewants


 
Nessun problema, una svista per motivi vari può capitare a tutti
 
 
 

 return islower(c) ? c+'A'-'a' : c;
 
mmhhh, anche con EBCDIC sembra funzionare...
http://en.wikipedia.org/wiki/EBCDIC
  (cfr. tabella)
 
Ciao Jack 
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?


 
Ricordavo che c'erano dei buchi
Ora vedendo la tabella questi buchi sono simmetrici tra le minuscole e 
maiuscole, quindi funziona
Grazie per la precisazione
 

 
http://en.wikipedia.org/wiki/EBCDIC
  (cfr. tabella)
 
No, non funziona, come si evince leggendo l'articolo della wikipedia.
 
EBCDIC e BCDIC suo antenato nacquero per rendere semplice la conversione
tra la codifica delle schede perforate che si usavano allora (un brevetto
di Hollerrith, che era tra i fondatori della IBM tra l'altro) e la 
rappresentazione interna dei caratteri delle macchine IBM. Il problema 
principale è che non esiste una sola versione di EBCDIC, che praticamente
ogni macchina ha la sua propria versione, che tutte queste versioni sono
incompatibili tra loro, che esistono versioni estese con caratteri 
accentati, segni diacritici e lettere insolite ma mancano i caratteri 
usualmente impiegati da tutti i linguaggi di programmazione prima tra 
tutti il C, e infine che i caratteri mancanti variano. Non mi meraviglia 
che in pratica EBCDIC veniva  usato solo dalla IBM.
 
Di volta in volta EBCDIC viene definito come: "Un algoritmo di criptazione
proprietario dell'IBM", "L'unico algoritmo di criptazione che è impossibile
decifrare", "Un sistema per rendere illeggibili i propri dati a se stessi".
 
 
Il codice da me postato funziona perché non suppone nessuna ipotesi sulla
posizione relativa dei blocchi delle lettere maiuscole e minuscole però 
ipotizza che le lettere di un tipo siano in uno stesso blocco e che 
le lettere abbiano lo stesso offset all'interno del blocco, cosa che non è.
Per le versioni recenti di EBCDIC (come quella riportata dalla wikipedia) 
questo è vero, in generale e per BCDIC no; potrebbe non funzionare.
 
Quindi sembra funzionare per caso, ma in realtà EBCDIC è un grosso problema
alla portabilità del codice e unito aL C... prevedo esplosioni atomiche. 
 
 
 

 Grazie per la precisazione
 
I buchi sono simmetrici, per così dire, in quella versione di EBCDIC di
wikipedia, per altre versioni o i codici BCDIC più vecchi non è detto.
 
 

 alla portabilità del codice e unito aL C... prevedo esplosioni atomiche.
 
ok, io ho guardato al volo solo la tabella wikipedia pensando fosse solo
quello, ma chiaro che se la tabella varia e' un casino.



 
 
OK, credo che si siamo capiti comunque, tra l' altro non sapevo che la 
codifica EBCDIC puo variare tra vari hw ed OS; credevo che fosse ben 
standardizzata.
Meno male che linux sui mainframe IBM serie Z usa ASCII  :)
A questo punto posso solo dire che se si vuole scrivere codice portabile 
non scrivere mai in un proprio programma 'A' - 'a' + c ma usare l' 
apposita funzione della libreria std
 
 

 apposita funzione della libreria std
 
quando c'e' (la libreria) sicuramente.


 
 
Quando non c'è (la libreria) quasi sicuramente puoi scegliere codifica che ti
piace di più! ;)
 
Ciao!


Tra l' altro avevo dimenticato, e lo aggiungo adesso
che le funzioni islower,isupper,tolower,toupper,ecc. cioè tutte quelle 
funzioni che lavorano sui caratteri dipendono anche dalla codepage 
impostata.
Senza tirare fuori unicode ma limitandosi alle varie codepage uno 
scritto come 'A' - 'a' + c vale solo se la codepage è quella 'C'
Cambiando codepage (Es: ISO8859-15) abbiamo le lettere accentate ben 
diverse tra una codepage ed una altra
Un altro buon motivo per utilizzare tali funzioni se sono disponibili
 

 standardizzata
 
Tutt'altro. Comunque la situazione non è poi così diversa dallo codifica
ASCII con le sue innumerevoli tabelle. Ricordo che lo ASCII originale a
sette bit è uno standard internazionale ISO (sviluppato proprio da IBM
che ha contribuito a non fare gli errori del BCDIC) mentre lo ASCII a otto
bit è soggetto a così tanti standard che è quasi un terno a lotto azzeccare
la codifica giusta al primo tentativo.
 
Tornando a EBCDIC IBM la adottata perchè la storia dell ASCII è stata 
molto tormenta e semplicemente IBM ha adattato la vecchia codifica 
BCDIC sul nuovo sistema /360 quando fu chiaro che nessuno avrebbe 
usato ASCII perché le periferiche non usavano la codifica ASCII.
 
La situazione si è normalizzata col tempo perché i vecchi dinosauri sono
morti, la codifica BDCIC è scomparsa, la IBM ha cercato di mantenere la 
codifica del IBM System/360 sulle macchine successive per cui...
 


 
BCD è oramai alla storia, EBCDIC è ancora usato sui mainframe IBM (i 
siemens sono oramai scomparsi)
La serie Z di IBM puo utilizzare sia EBCDIC che ASCII (con linux usa ASCII)