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.

El puntero de función devuelve mantiene cambiando los valores anteriores en un arreglo.

Estoy intentando llenar una matriz 2D con cadenas. El problema es que logro llenar el primer índice, pero cuando procedo a la siguiente cadena, sigue cambiando los índices anteriores. Probablemente sea un problema con el puntero, este es el código relevante.

char* get_song_name(const char* song)
{
    strip(song);
    FILE* fp = fopen(song, "r");
    char str[9999];
    while (!feof(fp))
    {
        fgets(str, 9999, fp);
        puts(str);
        strip(str);
        char* s = str;
        return s;
    }
}

FUNCIÓN DIFERENTE:
for (i = 0; i < lines; i++)
{
    char* st = fgets(buff, 250, fp);
    st = create_path("c:\\Users\\Marian\\Desktop\\beatles", st);
    name[i] = get_song_name(st); // FUNCIONA SIN EMBARGO CAMBIA EL VALOR DE LOS ÍNDICES ANTERIORES TAMBIÉN
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que en la función get_song_name, la variable char* s = str apunta al mismo lugar en memoria que str, lo que significa que cada vez que se modifica str, el valor de s también cambia. Por lo tanto, cuando se retorna s, siempre está apuntando al mismo lugar en memoria, que es el último valor leído del archivo.

    Para solucionar este problema, char* s = str debería reemplazarse por char* s = malloc(strlen(str) + 1) para asignar memoria para una nueva cadena, y luego copiar el contenido de str a s usando strcpy(s, str) en lugar de retornar s.

    Alternativamente, get_song_name puede ser reescrito para aceptar un parámetro de búfer y copiar el contenido de str al búfer antes de retornar. Esto asegura que se asigna un nuevo bloque de memoria para cada nombre de canción y que la función retorna el valor correcto sin cambiar los índices anteriores.

    void get_song_name(const char* song, char* buffer, size_t buffer_size)
    {
        strip(song);
        FILE* fp = fopen(song, "r");
        char str[9999];
        while (!feof(fp))
        {
            fgets(str, 9999, fp);
            strip(str);
            strncpy(buffer, str, buffer_size);
            buffer[buffer_size - 1] = '\0';
            break; // detener después de leer la primera línea
        }
        fclose(fp);
    }
    

    Finalmente, es importante asegurarse de que el array name esté correctamente asignado con suficiente memoria para contener todos los nombres de canciones. Si name no se asigna correctamente, podría sobrescribir memoria y causar un comportamiento indefinido.

Comments are closed.