Autor
|
Tema: Punteros a cadenas dinamicas (Leído 7,895 veces)
|
eduu15
Desconectado
Mensajes: 17
|
-La idea que tenia que no la he podido implementar pero dudo que se pueda, es que al pedir un nombre y apellido al usuario a priori NO SABEMOS cual va a ser la longitud de stdin que teclee el usuario. En la linea del malloc puse 10 por poner como pude haber puesto 20 pero en realidad no se cuanto va a ocupar el nombre y el apellido que me ingrese el usuario por teclado no se como implementarlo de tal manera que cuando se teclee un nombre y un apellido se calcule la longitud y luego ya reservar memoria para esa longitud a parte tambien para reservar la memoria justa y necesaria para lo que me teclee el usuario y no andar a ciegas suponiendo que va ingresar un nombre y apellido de 10,20,30 etc bytes -Como no me salio la idea hice esto que no se parece en nada a mi idea y que aun por encima no consigo hacer que funcione Espero haberme explicado con claridad y gracias Primera duda, porque el codigo no funciona? #include <stdio.h> #include <stdlib.h> #include <string.h>
int main(void){ char *nombre,*nombre2; nombre=malloc(10*sizeof(char)); //reservo 10 bytes printf("Introduce tu nombre y apellido: ");
fgets(nombre,9,stdin); //agrega NULL y \n si se ingresan menos caracteres if (nombre[strlen(nombre)-1] == '\n'){ nombre[strlen(nombre)-1] = '\0'; }
printf("%s\n",nombre);
long int longitud=(strlen(nombre)+1); //strlen no cuenta el NULL de final de cadena printf("%li\n",longitud);
if(longitud>8){ nombre2=realloc(nombre,15*sizeof(char)); //reasigno 5 bytes printf("%s\n",nombre); free(nombre2);
} free(nombre);
return 0; } Segunda duda, seria posible hacer la idea?
|
|
« Última modificación: 8 Abril 2018, 02:45 am por eduu15 »
|
En línea
|
|
|
|
eduu15
Desconectado
Mensajes: 17
|
Puede resultar un poco confuso pero mas o menos la idea seria esta: #include <stdio.h> #include <stdlib.h> void limpiar( void ){ system("cls||clear"); } int main( void ){ size_t tam_frases = 0, i; char **frases = NULL, salir; do { limpiar(); frases = realloc(frases, (tam_frases + 1) * sizeof(char*)); if(!frases) { fprintf(stderr, "\n\n *** Error al adquirir memoria ***\n\n"); exit(1); } printf("\nIngrese frase....: "); scanf("%m[^\n]%*c", &frases[tam_frases]); ++tam_frases; printf("\nPara continuar \"S\" para finalizar \"N\"....: "); scanf("%c%*[^\n]%*c", &salir); } while(salir != 'n' && salir != 'N'); printf ("\n Frases introducidas.....: "); for(i = 0; i < tam_frases; ++i) printf("\n>> %s", frases[i]); for(i = 0; i < tam_frases; ++i) free(frases[i]); return 0; } POST del codigo de MAZUS: https://foro.elhacker.net/programacion_cc/arreglo_de_cadenas_con_memoria_dinamica_realloc_lenguaje_c-t458601.0.html;msg2090624#msg2090624 en este codigo no se especifica ningun tamaño se reserva segun se necesita para lo que el usuario teclee si mal no entendi el codigo
|
|
« Última modificación: 7 Abril 2018, 18:58 pm por eduu15 »
|
En línea
|
|
|
|
eduu15
Desconectado
Mensajes: 17
|
Estaba pensando en otros lenguajes que derivan de c y se me vino a la cabeza python. Y la idea que tengo en c en python es la funcion input en python3 y raw_input en python2, no se si es el mejor ejemplo pero el codigo en PYTHON3 seria algo asi: while(1): teclado=str(input("Introduce lo que quieras: ")) #str convierte a string lo que le pasemos a input print(teclado)
Cada linea en python son 10 en c xD Complicandolo un poco mas while(1): teclado=str(input("Introduce lo que quieras o exit para salir: ")) if(teclado=="exit"): break print(teclado)
Espero que ahora se haya entendido bien
|
|
« Última modificación: 7 Abril 2018, 21:22 pm por eduu15 »
|
En línea
|
|
|
|
eduu15
Desconectado
Mensajes: 17
|
Con fgets casis seguro que no se puede al tener que pasarle el numero de bytes
|
|
« Última modificación: 7 Abril 2018, 21:40 pm por eduu15 »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
A ver, lástima que no haya nada como %m en windows pero se puede simular. La idea es ir adquiriendo trozos razonables de memoria con realloc, para no ir perdiendo tiempo en adquisición de memoria y copia. En este caso se adquieren bloques de memoria de 10 bytes cada vez. Cuando se llena se adquieren 10 más de forma automática. Para el final de la adquisición de la cadena, marcado por el carácter '\n', de añade el carácter nulo '\0' para marcar el final de la cadena si hay espacio; si no añade un byte más exproceso para alojarlo. Al final se genera una cadena dinámica del mismo tamaño que la adquirida por teclado y se le copiará el contenido. La cadena auxiliar, la utilizada para adquirir del teclado es destruida y se devuelve la cadena ajustada. Eso sí, hay que recordar destruirla cuando ya no se necesite. Se considera que un char es un byte. #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; str = string_input(); }
|
|
« Última modificación: 7 Abril 2018, 21:55 pm por MAFUS »
|
En línea
|
|
|
|
eduu15
Desconectado
Mensajes: 17
|
Lo primero gracias por el code y lo segundo en el primer realloc no seria como hacer un malloc? porque al pasarle NULL se va a comportar como un malloc si no me equivoco ya que no estas reasignando memoria al pasarle NULL. No seria mejor hacer str=malloc(i+chunk) o un str=calloc(i+chunk)?
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Sí, funciona como un malloc al pasarle null, pero si te fijas el realloc está en un bucle así que se necesita realojar el array. Por eso se pasa un null al principio, para que haga una primera adquisición tipo malloc pero a las siguientes trabaja como realloc. Por eso esa construcción.
|
|
|
En línea
|
|
|
|
eduu15
Desconectado
Mensajes: 17
|
Vale ya entiendo gracias
|
|
|
En línea
|
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Este último que has puesto es una máquina de escribir. Lo que consigues por teclado lo sueltas por la pantalla. No hace nada más: no se puede guardar para usarlo después, tratarlo, modificarlo, en definitiva trabajar los datos. Tal como los consigues los sueltas.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
JTable tamaño de celdas ajustable y mostrar texto completo
Java
|
marvic
|
1
|
29,571
|
12 Abril 2009, 19:57 pm
por marvic
|
|
|
Problema con el tamaño de una estructura y/o cadena en Dev-C++
Programación C/C++
|
BlerofonT
|
4
|
3,458
|
8 Abril 2018, 10:52 am
por eduu15
|
|
|
subir y mostrar las imagenes en un mismo tamaño.
PHP
|
luispolobenites
|
1
|
1,955
|
16 Octubre 2014, 20:02 pm
por Beakman
|
|
|
Mostrar la cantidad de veces que una cadena se repite
Programación C/C++
|
andoporto
|
1
|
3,201
|
9 Febrero 2015, 08:10 am
por eferion
|
|
|
Especificar una cadena de caracteres para invoke en MASM32.
ASM
|
Usuario887
|
2
|
3,310
|
21 Febrero 2021, 22:18 pm
por Usuario887
|
|