2010-11-09 8 views

Respuesta

48

strlen generalmente funciona contando los caracteres en una cadena hasta que se encuentre un carácter \0. Una implementación canónica sería:

size_t strlen (char *str) { 
    size_t len = 0; 
    while (*str != '\0') { 
     str++; 
     len++; 
    } 
    return len; 
} 

No hay ningún error inherente en la función, funciona exactamente como está documentado.

Eso no quiere decir que no tiene problemas, a saber:

  • si se le pasa una "cadena" que no tiene un \0 al final, es posible que encuentre problemas, pero técnicamente , esa no es una cadena C (a) y es tu culpa.
  • no puede poner \0 caracteres en su cadena pero, de nuevo, no sería una cadena C en ese caso.
  • no es la manera más eficiente: puede almacenar un largo por adelantado para que pueda obtener la longitud mucho más rápido.

Pero ninguno de esos son errores, solo son consecuencias de una decisión de diseño.

Véase también this excellent article por Joel Spolsky donde discute varios formatos de cuerda y sus características, incluyendo cuerdas C normales, cuerdas Pascal y la combinación de las dos cuerdas Pascal con terminación nula, aunque tiene una más, digamos, " colorido" plazo para ellos :-)


(a) cadena AC se define como una serie de caracteres que no son de terminador (es decir, cualquier otra que \0) seguido de que terminador. Por lo tanto, esta definición no permite los dos terminadores incorporados dentro de la secuencia y las secuencias sin dicho terminador.

O, dicho de forma más sucinta (según la norma ISO):

Una cadena es una secuencia contigua de caracteres terminadas por e incluyendo el primer carácter nulo .

Cuestiones relacionadas