2015-06-05 22 views
5

Sono abbastanza nuovo per la programmazione e stavo chiedendo il motivo per cui da questo codice:Come "per (; * p; ++ p) * p = tolower (* p);" lavoro in c?

for (; *p; ++p) *p = tolower(*p); 

lavora per abbassare un caso di stringa in C, quando i punti p in una stringa?

+0

Ciao. perché pensi che non dovrebbe funzionare? \ –

+1

Quale parte non capisci? – juanchopanza

+0

Salve, non sono sicuro di come * p possa essere usato come secondo parametro nel ciclo for, e come il loop sa terminare – Dave

risposta

2

Per deselezionare, supponiamo che p sia un puntatore a char e appena prima del ciclo for, punta al primo carattere di una stringa.

In C, le stringhe sono tipicamente modellate da un insieme di valori contigui char con una finale 0 aggiunto alla fine che funge terminatore null.

*p verrà valutato su 0 una volta raggiunta la stringa terminazione nulla. Quindi verrà chiuso il ciclo for. (La seconda espressione nel ciclo for funge da test di terminazione).

++p anticipi al carattere successivo nella stringa.

*p = tolower(*p) imposta tale carattere in lettere minuscole.

+0

Ah questo è il bit che non conoscevo, quindi per impostazione predefinita la condizione di un ciclo for è se il secondo parametro è 0, quindi uscirà? – Dave

+0

In effetti, la seconda espressione nel ciclo 'for' è il test di terminazione. – Bathsheba

3

In generale, questo codice:

for (; *p; ++p) *p = tolower(*p); 

fa non

lavora per abbassare un caso di stringa in C, quando i punti p in una stringa?

funziona per puro ASCII, ma dal momento che char solito è un tipo di firma, e dal momento che tolower richiede un argomento non negativo (tranne il valore speciale EOF), il pezzo sarà, in generale, hanno un comportamento indefinito.

Per evitare che, gettata l'argomento unsigned char, in questo modo:

for (; *p; ++p) *p = tolower((unsigned char)*p); 

Ora si può lavorare per codifiche a singolo byte come Latin-1, a condizione di aver impostato le impostazioni internazionali corrette tramite setlocale, per esempio setlocale(LC_ALL, "");. Tuttavia, si noti che la codifica UTF-8 molto comune non è un singolo byte per carattere. Per gestire il testo UTF-8 è possibile convertirlo in una stringa ampia e in caratteri minuscoli.


Particolari:

  • *p è un'espressione che denota l'oggetto che p punti, presumibilmente un char.

  • Come condizione di continuazione per il ciclo for, qualsiasi non zero char valore *p denota, ha l'effetto di True logico, mentre il valore zero char alla fine della stringa ha l'effetto di falso logico, che termina il cappio.

  • ++p fa avanzare il puntatore del puntatore al successivo char.

+0

Questo è un po 'più avanti di dove sono, ma cercherò di sedermi per capirlo, evviva! – Dave

+0

+1 per essere pignoli (che è buono, specialmente in C) e per menzionare le codifiche, proprio così l'OP tiene a mente che sono in giro. – dummydev