2010-09-20 13 views
5

Sto imparando C. E, vedo questa funzione trovare la lunghezza di una stringa.comprensione della funzione strlen in C

size_t strlen(const char *str) 
{ 
size_t len = 0U; 
while(*(str++)) ++len; return len; 
} 

Ora, quando esce il ciclo? Sono confuso, dal momento che str ++, aumenta sempre il puntatore.

+0

FYI: Leggi Kerningham e Richie. Hanno introdotto questo stile di programmazione. Una parola di precauzione non deve mai usare questo stile nelle applicazioni commerciali. –

+0

Ho quel libro, ma prima utilizzo altre risorse per stare comodo con C :) – jess

+0

@ user439578: Che cosa ha lo stile (qualsiasi stile) per il tipo di applicazione? Basta usare lo stile che preferisci e 'indent' (con stile house) prima di inviare il codice. – pmg

risposta

10
  1. stringhe C terminano con il carattere NUL che ha il valore di 0
  2. 0 è false in C e quant'altro è true.

Quindi continuiamo ad incrementare il puntatore nella stringa e la lunghezza finché non troviamo un NUL e quindi restituiamo.

+0

Conoscevo il primo punto. Il secondo ha chiarito !! Grazie – jess

+1

Sto bene con la tua risposta, ma per la menzione di ASCII. Sarebbe meglio lasciarlo fuori.'nul' è garantito come' 0' con qualsiasi codifica. –

+0

@Jens modificato secondo la vostra raccomandazione. – doron

11
while(*(str++)) ++len; 

è stessa:

while(*str) { 
++len; 
++str; 
} 

è stessa:

while(*str != '\0') { 
++len; 
++str; 
} 

Così ora si vede quando str punti al null char alla fine della stringa, la condizione di test fallisce e tu interrompi il loop.

+1

"è uguale a:" tranne per il valore finale di 'str', ma in questo caso non è utilizzato. –

0

Una volta *(str++) restituisce 0, il ciclo termina. Ciò si verifica quando str punta all'ultimo carattere della stringa (poiché le stringhe in C terminano 0).

2

è necessario capire due concetti per afferrare l'idea della funzione:

1 °) Una stringa C è un array di caratteri.

2 °) In C, una variabile di matrice è in realtà un puntatore al primo caso della tabella.

Quindi cosa fa? Usa l'aritmetica del puntatore per analizzare la tabella (++ su un puntatore significa: prossimo caso), finché non arriva al segnale finale ("\ 0").

+0

tabella di caratteri? Intendi serie di personaggi? –

+1

Sì. Faccio sempre questo errore in inglese (in francese, diciamo "tableau" per "array", quindi tendo ad andare con "table"). – Raveline

0

corretto, str++ aumenta il contatore e restituisce il valore precedente. L'asterisco (*) dereferenzia il puntatore, cioè ti dà il valore del carattere.

Le stringhe C terminano con un byte zero. Il ciclo while termina quando il condizionale non è più vero, ovvero quando è zero.

Quindi il ciclo while viene eseguito finché non incontra un byte zero nella stringa.

Problemi correlati