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é hay 3 caracteres no deseados al principio de la cadena en lenguaje C?

Tengo un problema con este programa en C que lee el contenido de un archivo y lo copia en una cadena para luego imprimirlo.
Cuando asigno memoria a una cadena, siempre tiene 3 caracteres extraños en ella, y eso lo podría solucionar poniendo ‘\0’ al principio para inicializarlo como una cadena vacía, como se muestra en la parte 1 y 2.
Pero cuando se trata de leer el archivo, incluso con esa técnica los 3 caracteres no desaparecerán, como se muestra en la parte 3.

¿Alguien sabe por qué se imprimen esos 3 caracteres, sabiendo que si copio la cadena en otro archivo, no aparecen en él; y por qué siguen apareciendo cuando leo el archivo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el programa es que no verifica si el archivo leído tiene más de 20 caracteres. Si lo tiene, intentará leerlos y ponerlos en la cadena, lo que causa un comportamiento inesperado. Los 3 caracteres que aparecen son valores basura que no se inicializaron ni se establecieron en cero.

    Para solucionar este problema, el programa debe verificar si el archivo tiene más de 20 caracteres y ajustar el tamaño de asignación en consecuencia. Otra solución es utilizar la asignación de memoria dinámica con realloc para redimensionar la cadena según sea necesario.

    Además, el programa siempre debe inicializar la cadena con '\0' antes de su uso para evitar valores basura.

    Aquí hay una versión actualizada del programa con estas mejoras:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        const int length = 20;
        char* buffer = (char*)malloc(length + 1); // siempre se inicializa el búfer
        memset(buffer, '\0', length + 1);
    
        FILE* file = fopen("test.txt", "r");
        if (file == NULL) {
            printf("Error al abrir el archivo\n");
            return 1;
        }
    
        size_t bytesRead = fread(buffer, sizeof(char), length, file);
        if (bytesRead < length) {
            buffer[bytesRead] = '\0'; // se agrega el terminador nulo al final
        } else {
            buffer = (char*)realloc(buffer, bytesRead + 1); // redimensionar el búfer
            buffer[bytesRead] = '\0'; // se agrega el terminador nulo al final
        }
    
        printf("%s\n", buffer);
    
        fclose(file);
        free(buffer); // siempre se libera la memoria
        return 0;
    }
    

    Este programa verifica si el archivo tiene más de 20 caracteres y redimensiona el búfer dinámicamente. También inicializa el búfer con '\0' y agrega el terminador nulo al final de la cadena. Finalmente, libera la memoria antes de salir del programa.

    Nota: Siempre es una buena práctica verificar errores al trabajar con archivos y asignación de memoria para evitar comportamientos inesperados o bloqueos.</string.h></stdlib.h></stdio.h>

Comments are closed.