Punteros a cadenas dinamicas

Iniciado por eduu15, 7 Abril 2018, 14:35 PM

0 Miembros y 1 Visitante están viendo este tema.

eduu15

#10
Y se podria guardar la salida de getchar?




He cambiado el titulo de la pregunta "Arrays de caracteres dinamicos" pero no se si estara bien porque en realidad serian punteros a cadenas dinamicas si no me equivoco




Volvi a cambiar el titulo ahora creo que esta bien y es mas claro corrijanme si me equivoco




Que lio con el titulo...




Otra pregunta MAFUS perdona por hacer tantas... porque ret_val y str no son un puntero doble **ret_val **str como en este code: https://foro.elhacker.net/programacion_cc/punteros_a_cadenas_dinamicas-t482323.0.html;msg2159182#msg2159182




En total son 3 preguntas:
1-Y se podria guardar la salida de getchar?
2-el dichoso titulo de la pregunta
3-La del puntero doble




[MOD] No hacer quintuple post, se usa el botón "modificar" para añadir comentarios.

MAFUS

Bien, antes de nada y siguiendo las reglas del foro, no debe hacer publicaciones seguidas. Si no ha habido respuestas posteriores y quieres actualizar tu mensaje debes ir al botón 'editar' de tu último mensaje del hilo y allí añadir las novedades.

Respondiendo a tus preguntas:
1. Sí, se puede guardar la salida de getchar. Fíjate que aquí se hace while((c=getchar())!='\n') {

2. El título está bien

3. En el código que has apuntado es puntero doble porque guarda una lista de cadenas cuando en el último el que te he hecho solo guarda una única cadena.

eduu15

Estaba repasando el code y me surgio una duda. Porque otro free en main?
CitarCode original

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    char* string_input() {
        char *ret_val; // cadena que será devuelta
        char *str = NULL; // cadena auxiliar para conseguir datos del teclado
        char c;
        const unsigned chunk = 10; // tamaño de trozos de memoria en bytes o caracteres
        int i=0; // posición del cursor en str
     
        while((c=getchar())!='\n') { // adquisición por teclado
            if(i%chunk == 0) // si i ha alcanzado el máximo de memoria
                str=realloc(str, i+chunk); // añadirle más
            str[i] = c; // copiar el caracter adquirido a la cadena
            ++i; // avanzar el puntero en str
        }
        if(i%chunk == 0) // si i ha alcanzado el máximo de memoria
            str=realloc(str, i+1); // añadir un byte más a str
        str[i] = '\0'; // cerrar la cadena
     
        ret_val = malloc(strlen(str)+1); // dimensionar la cadena de regreso con el tamaño exacto
        strcpy(ret_val, str); // copiar la cadena
     
        free(str); // borrar la cadena auxiliar
     
        return ret_val; // devolver la cadena resultado
    }
     
    int main(void) {
        char *str;
     
        printf("> ");
        str = string_input();
     
        printf("%s", str);
     
        free(str); //Porque este free? Para liberar ret_val?
    }

MAFUS

El fred que hay en string_input es para su variable local str. Ahora subte fijas en esa misma función se dimensiona otra variable, ret_val, que no es liberada, sino que su dirección a la que apunta es pasada a str de main y por tanto ahora es main la encargada de liberar esa memoria.