2011-02-01 11 views

risposta

3

Suppongo che questo è un modo che utilizza l'implementazione esistente di toUpper (si noti che toLower e toUpper sono definiti come mangiare int e ho fatto in modo di conseguenza; io parto dal presupposto che si dispone di un errore di battitura nel vostro OP):

int toLower(int c) { 
    for(int i = 0; i <= UCHAR_MAX; i++) { 
     if(c != i && toUpper(i) == c) { 
      return i; 
     } 
    } 
    return c; 
} 

Modifica: Grazie, Chris Lutz.

+0

@Chris Lutz: No, non la penso così. Si prega di vedere la condizione 'se'. – jason

+0

Il mio male. L'hai cambiato? Lo ricordo diversamente, ma potrei semplicemente non funzionare (è successo oggi). –

+0

@Chris Lutz: conosco il sentimento; nessun problema. Originariamente avevo 'upper == c && c! = I' ma lo ho cambiato in' c! = I && upper == c'. – jason

0

Creare due array paralleli (A e B), ciascuno abbastanza grande da contenere l'intero set di caratteri. Passare attraverso tutti i valori in A e sostituire ogni valore con toUpper(value). Quindi attraversare B, e ovunque A differisce, sostituire B [A [valore]] con B [valore] (cioè, ovunque toUpper sostituito un valore con una versione maiuscola, sostituire la versione maiuscola in B con la parte inferiore- versione del caso da cui è stata convertita). Una volta che hai finito, toLower restituisce solo B[value] (e A può essere scartato).

Questo presuppone che si tratti di lettere maiuscole o minuscole che formano una biiezione (che, dovrei aggiungere, non è sempre il caso), ma credo che l'assunto sia implicito nella domanda).

2

L'unico modo corretto che posso vedere per fare questo è:

int toLower(int c) 
{ 
    if(toUpper(c) != c) return c; // keep lowercase characters unchanged 
    if(!isalpha(c)) return c; 
    return c - 'A' + 'a'; // nonportable hack, only works for ASCII 
} 

Tecnicamente, l'ultima riga dovrebbe essere un switch dichiarazione in piena regola, o qualcosa di simile:

static char lower[] = "abcdefghijklmnopqrstuvwxyz"; 
static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
// ... 
return lower[strchr(upper, c) - upper]; 

Perché il lo standard non garantisce che i caratteri alfabetici siano consecutivi nel set di caratteri. Tuttavia, il supporto ASCII è "abbastanza buono" per la maggior parte delle persone.

+0

Non so se i tuoi requisiti richiedono di non utilizzare altre funzioni di libreria standard. Se lo fanno, allora i tuoi requisiti sono molto sfortunati. –

Problemi correlati