es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué este programa en C detecta dos caracteres ‘\0’ en una cadena cuando se descomenta una línea de código no relacionada?

Actualmente estoy aprendiendo C y escribí este programa para comprobar si el carácter ‘\0’ realmente está al final de las cadenas, como se indica en “K and R”.

Sin embargo, obtuve un resultado extraño.

Si comento la declaración “int lista[] = {0, 1, 2, 3, 4};” del programa (esta es una declaración que no tiene nada que ver con las otras declaraciones de este programa, era parte de otra prueba que iba a hacer), la salida del programa sale como se esperaba, detectando un carácter ‘\0’ al final de la cadena.

Sin embargo, si dejo la declaración sin comentar, la salida del programa detecta dos carácter ‘\0’ al final de la cadena.
¿Por qué sucede esto?

Este es el programa con la declaración sin comentar:

#include <stdio.h>

int main(void)
{
int lista[] = {0, 1, 2, 3, 4};
char string[] = "linhas";

for (int i = 0; i &lt;= sizeof(string); i++)
{
    if (string[i] != '\0')
    {
        printf("%c\n", string[i]);
    }
    else
    {
        printf("este maldito carácter nulo\n");
    }
}

}

Esto produce este resultado:

l
i
n
h
a
s
este maldito carácter nulo
este maldito carácter nulo

Este es el programa con la línea comentada:

#include <stdio.h>

int main(void)
{
/int lista[] = {0, 1, 2, 3, 4};/
char string[] = "linhas";

for (int i = 0; i &lt;= sizeof(string); i++)
{
    if (string[i] != '\0')
    {
        printf("%c\n", string[i]);
    }
    else
    {
        printf("este maldito carácter nulo\n");
    }
}

}

produce:

l
i
n
h
a
s
este maldito carácter nulo

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Explicación

    El problema es causado por la condición del bucle for, que está comprobando i <= sizeof(string).

    En el primer programa, donde int lista[] = {0, 1, 2, 3, 4}; está descomentado, el tamaño del array string es en realidad más grande que la longitud de la palabra “linhas” debido a la presencia del array int lista. El operador sizeof devuelve el tamaño total del array string más el array lista.

    Por lo tanto, la condición i <= sizeof(string) está haciendo que el bucle continúe iterando más allá del final del array string, hasta que llega al final del array combinado más grande. Y como el array lista no está inicializado con ningún valor, los caracteres extra leídos son caracteres nulos, que se muestran como “this dawmn null char”.

    En el segundo programa, donde el array lista está comentado, el operador sizeof devuelve correctamente el tamaño sólo del array string. Por lo tanto, la condición del bucle i <= sizeof(string) se detiene al final del array string, lo que resulta en la detección y visualización de sólo un carácter nulo.

    Para solucionar este problema, la condición del bucle debe cambiarse a i < sizeof(string), de modo que se detenga al final del array string, independientemente del tamaño de cualquier otro array.

    Aquí está el código corregido:

    “`
    #include <stdio.h>

    int main(void)
    {
    int lista[] = {0, 1, 2, 3, 4};
    char string[] = “linhas”;

    for (int i = 0; i < sizeof(string); i++)
    {
        if (string[i] != '\0')
        {
            printf("%c\n", string[i]);
        }
        else
        {
            printf("this damn null char\n");
        }
    }
    

    }
    “`</stdio.h>

Comments are closed.