Estoy haciendo algunas preguntas de rompecabezas C. En la mayoría de los casos, puedo encontrar la respuesta correcta, pero con eso tengo problemas. Sé la respuesta correcta usando el compilador, pero no sé el motivo.
Echa un vistazo al código:
char c[] = "abc\012\0x34";
que seria strlen(c)
regresar, usando un compilador C estándar?
Mi compilador devuelve 4 cuando lo que esperaba era 3.
Lo que pensé es strlen()
buscaría la primera aparición de la NULL
carácter pero de alguna manera el resultado es uno más de lo que esperaba.
¿Alguna idea de por qué?
Vamos a escribir
char c[] = "abc\012\0x34";
con caracteres individuales:
char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' };
El primero \0
ves es el comienzo de una secuencia de escape octal \012
que se extiende sobre los siguientes dígitos octales.
Las secuencias de escape octales se especifican en la sección 6.4.4.4 del estándar (borrador N1570):
secuencia de escape octal:
\
dígito octal
\
dígito octal dígito octal
\
dígito octal dígito octal dígito octal
consisten en una barra invertida seguida de uno, dos o tres dígitos octales. En el párrafo 7 de esa sección, se da el alcance de las secuencias de escape octales y hexadecimales:
7 Cada secuencia de escape octal o hexadecimal es la secuencia de caracteres más larga que puede constituir la secuencia de escape.
Tenga en cuenta que mientras que la longitud de una secuencia de escape octal se limita a un máximo de tres dígitos octales (por lo tanto "\123456"
consta de cinco caracteres, { '\123', '4', '5', '6', '\0' }
), las secuencias de escape hexadecimales tienen una longitud ilimitada
secuencia de escape hexadecimal:
\x
dígito hexadecimal
Secuencia de escape hexadecimal dígito hexadecimal
y por lo tanto "\x123456789abcdef"
consta de sólo dos caracteres ({ '\x123456789abcdef', '\0' }
).
NULL
es (una macro que se expande a) un constante de puntero nulo. Usar eso para referirse al carácter nulo'\0'
es potencialmente confuso.–Keith Thompson
14 de junio de 2013 a las 17:48
Continuando con el comentario de Keith, el término para
'\0'
esNUL
(con una sola L).– Shahbaz
30 de noviembre de 2013 a las 14:28