2010-04-09 28 views
6
char p[4]={'h','g','y'}; 
cout<<strlen(p); 

impresiones de este código 3.¿Por qué no me funciona el strlen?

char p[3]={'h','g','y'}; 
cout<<strlen(p); 

Esto imprime 8.

char p[]={'h','g','y'}; 
cout<<strlen(p); 

Este nuevo imprime 8.

favor me ayude ya que no puedo entender por qué tres diferentes los valores se imprimen cambiando el tamaño de la matriz.

+3

¿Por qué es este CW? –

+2

Además, use 'char p [] =" hgy ";' – Pyrolistical

+3

@Paul: porque aproximadamente 17 personas lo formatearon simultáneamente. La advertencia de edición simultánea solo funciona si las ediciones duran más de un minuto más o menos. –

Respuesta

27

strlen comienza en el puntero dado y avanza hasta que alcanza el carácter '\0'. Si no tiene un '\0' en su matriz, podría ser cualquier número hasta que se llegue a '\0'.

Otra forma de llegar al número que está buscando (en el caso que ha mostrado) es utilizando: int length = sizeof(p)/sizeof(*p);, que le dará la longitud de la matriz. Sin embargo, esa no es estrictamente la longitud de cadena definida por strlen.

Como @John Dibling menciona, la razón por la que strlen da el resultado correcto en su primer ejemplo es que ha asignado espacio para 4 caracteres, pero solo utilizó 3; el 1 carácter restante se inicializa automáticamente a 0, que es exactamente el carácter '\0' que busca strlen.

+11

+1 esta es una buena respuesta. Lo único que agregaría es una explicación de por qué funciona el primer fragmento de código. En 'char p [4] = {'h', 'g', 'y'};' p es 4 caracteres, pero solo 3 se inicializaron explícitamente, por lo que el compilador inicializa todos los elementos restantes (no especificados) a '0'. –

+0

Estoy totalmente de acuerdo con el comentario anterior. – matias

0

'\0' finaliza tu char buffer.

char p[4]={'h','g','y', '\0'}; 
+1

En este ejemplo específico, el '\ 0 'final no es necesario. Todos los elementos no especificados se inicializarán a cero. –

1

Eso le dará un número al azar. strlen requiere que las cadenas terminen con un '\0 'para funcionar.

+1

Estrictamente hablando, el número será indefinido, no aleatorio. (es decir, no use strlen() como base para los resultados de su lotería; ^)) –

1

probar esto:

char p[4]={'h','g','y', '\0'}; 
4

Sólo el primer ejemplo tiene una matriz nula de caracteres terminada - los otros dos ejemplos no tienen la terminación nula, por lo que no se puede utilizar strlen() en ellos de una manera bien definida .

char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0' 

char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator 

char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0' 

Tenga en cuenta que en el último caso, si se ha utilizado una cadena literal para inicializar la matriz, se llega a un terminador nulo:

char p[]= "hgy"; // p[] has 4 elements, last one is '\0' 
0

Esto es debido a strlen() espera encontrar un nulo -terminator para la cadena. En este caso, no lo tiene, por lo que strlen() sigue contando hasta que encuentra \ 0 o da una violación de acceso a la memoria y su programa muere. ¡Q.E.P.D!

1

strlen es una función de biblioteca estándar que funciona con strings (en el sentido C del término). La cadena se define como una matriz de valores char que finaliza con un valor de \0. Si proporciona algo que no es una cadena a strlen, el comportamiento no está definido: el código puede bloquearse, el código puede producir resultados sin sentido, etc.

En sus ejemplos, solo el primero suministra strlen con una cadena , por lo que funciona como se esperaba. En el segundo y el tercer caso, lo que usted proporciona no es una cadena (no terminada con \0), por lo que es de esperar que los resultados no tengan sentido.

Cuestiones relacionadas