strlen: la longitud de la cadena a veces aumenta en 1

3 minutos de lectura

strlen la longitud de la cadena a veces aumenta en
Prz3m3k

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é?

  • 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' es NUL (con una sola L).

    – Shahbaz

    30 de noviembre de 2013 a las 14:28


strlen la longitud de la cadena a veces aumenta en
daniel pescador

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' }).

  • Estoy seguro de que puede encontrar algo de consuelo en sus setenta mil representantes restantes.

    – cmh

    10 de enero de 2013 a las 18:14


  • @effeffe, Esto tiene el potencial de terminar como una insignia de votos de oro. ¿Es eso lo suficientemente bueno?

    – chris

    10 de enero de 2013 a las 18:15

  • @chris Seguro que parece que me puede dar plata, pero el oro sería vergonzoso.

    –Daniel Fischer

    10 de enero de 2013 a las 18:16

  • @DanielFischer, no he visto nada como esto en SO. Se ajusta a un nicho bastante bueno.

    – chris

    10 de enero de 2013 a las 18:18

  • @GrijeshChauhan Porque las secuencias de escape hexadecimales comienzan con \xno \0xuna secuencia de escape hexadecimal sería '\x34'. En "...\0x34..."los '\0' es una secuencia de escape octal, seguida de los tres caracteres ordinarios 'x', '3' y '4'. No sé por qué comienzan las secuencias de escape hexadecimales \x y no \0xsupongo que es más fácil de analizar si el tipo de secuencia de escape se determina inmediatamente después de la barra invertida.

    –Daniel Fischer

    14 de junio de 2013 a las 17:17

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad