2010-09-20 16 views
5

Estoy aprendiendo C. Y, veo esta función encontrar la longitud de una cadena.entender la función strlen en C

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

Ahora, ¿cuándo sale el lazo? Estoy confundido, ya que str ++, siempre aumenta el puntero.

+0

FYI: Leer Kerningham y Richie. Han introducido este estilo de programación. Sin embargo, una palabra de precaución es no utilizar este estilo en aplicaciones comerciales. –

+0

Tengo ese libro, pero primero uso otros recursos para sentirme cómodo con C :) – jess

+0

@ user439578: ¿Qué tiene que ver el estilo (cualquier estilo) con el tipo de aplicación? Solo usa el estilo que más te guste y 'sangría' (con el estilo de la casa) antes de enviar el código. – pmg

Respuesta

10
  1. cadenas de C se terminan con el carácter NUL que tiene el valor de 0
  2. 0 es false en C y cualquier otra cosa es true.

Así que seguimos incrementando el puntero en la cadena y la longitud hasta que encontremos un NUL y luego regresemos.

+0

Conocí el primer punto. ¡El segundo lo dejó en claro! Gracias – jess

+1

Estoy bien con su respuesta, pero para mencionar ASCII. Sería mejor dejar eso fuera.'nul' se garantiza que es' 0' con cualquier codificación. –

+0

@Jens modificado según su recomendación. – doron

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

es igual que:

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

es igual que:

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

Así que ahora que se ve cuando str apunta a la null carbón al final de la cadena, la condición de prueba falla y dejas de repetir.

+1

"es lo mismo que:" excepto por el valor final de 'str', pero no se usa en este caso. –

0

Una vez que *(str++) devuelve 0, el ciclo sale. Esto sucederá cuando str apunta al último carácter de la cadena (porque las cadenas en C tienen 0 terminadas).

2

Es necesario comprender dos nociones para agarrar la idea de la función:

1 °) Una cadena C es una matriz de caracteres.

2 °) En C, una variable de matriz es en realidad un puntero al primer caso de la tabla.

Entonces, ¿qué strlen hace? Utiliza aritmética de puntero para analizar la tabla (++ en un puntero significa: el siguiente caso), hasta que llega a la señal final ("\ 0").

+0

tabla de caracteres? ¿Te refieres a una serie de personajes? –

+1

Sí. Siempre cometo este error en inglés (en francés, decimos "cuadro" para "conjunto", por lo que tiendo a ir con "tabla"). – Raveline

0

Correcto, str++ aumenta el contador y devuelve el valor anterior. El asterisco (*) desreferencia el puntero, es decir, le da el valor del carácter.

Las cadenas C terminan con un byte cero. El ciclo while sale cuando el condicional ya no es verdadero, lo que significa que es cero.

Así que el lazo while se ejecuta hasta que encuentra un byte cero en la cadena.