2009-03-10 15 views
22

¿Se define strlen(const char *s) cuando s no tiene terminación nula? De ser así, ¿qué devuelve?strlen() en cadena de caracteres no terminada en nulo?

+8

pregúntese: ¿Cómo debería strlen() saber dónde termina su cadena, si no es terminada en nulo? – DevSolar

+1

Técnicamente hablando, no existe una cadena C que no tenga terminación NUL, porque el Terminador NUL se define como parte de la cadena C :) – fredoverflow

Respuesta

30

No, no está definido. Puede provocar una infracción de acceso a la memoria, ya que seguirá contando hasta que llegue al primer byte de memoria cuyo valor es 0.

+13

También puede hacer que los demonios salgan por la nariz. http://catb.org/jargon/html/N/nasal-demons.html –

+2

Eso explica mis fosas nasales doloridas. –

1

Devolverá el número de caracteres encontrados antes de que se encuentre '\ 0'.

+0

....... o no. – alk

1

No está definido. Causa un comportamiento indefinido, lo que significa que cualquier cosa puede suceder, lo más probable es que su programa se bloquee.

-2

Siempre está definido.

Devolverá la longitud de la "cadena" hasta que llegue a un byte con un nulo en ella. Mala idea porque esto puede causar un desbordamiento del búfer.

+2

No, no está definido. Una vez que comienzas a atravesar el espacio asignado para la cadena, ya sea a través de malloc o en la pila/pila, los resultados están estrictamente indefinidos. –

9

de la norma C99:

La función strlen devuelve el número de caracteres que preceden a la terminación de carácter nulo.

Si no hay un carácter nulo, significa que el resultado no está definido.

0

strlen() solo funciona (hace algo útil) en cadenas terminadas en nulo; obtendrás un resultado completamente indefinido si pasas algo más que eso. Si tiene suerte, no causará un bloqueo :)

+2

corrección, si tiene suerte se bloqueará. No querrá que este tipo de error pase desapercibido :-P. –

2

Si su cadena no está terminada en NUL, la función seguirá buscando hasta que encuentre una.

Si tiene suerte, esto hará que su programa falle.

Si no tiene suerte, obtendrá un largo más grande de lo esperado, con muchos valores "inesperados".

5

Puede ser que necesite strnlen?

+5

Desafortunadamente, esto no es parte de la norma C. – joveha

0

hombre 3 strcspn

size_t strcspn (const char * s, char const * rechazan);

Una longitud de las cadenas de colon delimitado:

size_t len = strcspn(str, ":"); 

Una longitud de las cadenas delimitados por comas:

size_t len = strcspn(str, ","); 

Una longitud de las cadenas delimitados por tabuladores:

size_t len = strcspn(str, "\t"); 
Cuestiones relacionadas