Autor
|
Tema: Ayuda asignacion de memoria dinámica palabras en c (Leído 13,726 veces)
|
newfag
Desconectado
Mensajes: 7
|
buenas, tengo un problemilla, quiero hacer un programa que acepte un numero indeterminado de palabras y las imprima por pantalla(esto último solo para ver si funciona), había pensado algo así pero no va, una ayudita por favor #include<stdio.h> #include<stdlib.h> #include<string.h>
main() { int n,i; char *vect; printf("Nº palabras: "); scanf("%d" ,&n);
vect=(char *)calloc(sizeof(char),n); for(i=0;i<n;i++) { printf("palabra: "); scanf("%s" ,vect[i]); } for(i=0;i<n;i++) printf("%s\n", vect[i]); }
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
Ahi estas reservando memoria para una sola palabra de n caracteres
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
newfag
Desconectado
Mensajes: 7
|
Ahi estas reservando memoria para una sola palabra de n caracteres ala es verdad!!! vale, me pongo a ello, muchas gracias EI: juntando mensajes.arreglado, por si alguien le sirve de ayuda aqui lo dejo #include<stdio.h> #include<stdlib.h> #include<string.h>
main() { int n,i; char **vect; printf("Nº palabras: "); scanf("%d" ,&n);
vect=(char **)calloc(sizeof(char*),n); for(i=0;i<n;i++) vect[i]=(char*)malloc(sizeof(char)*50);
for(i=0;i<n;i++) { printf("palabra: "); scanf("%s" ,vect[i]); } for(i=0;i<n;i++) printf("%s\n", vect[i]); }
|
|
« Última modificación: 18 Mayo 2010, 17:43 pm por Eternal Idol »
|
En línea
|
|
|
|
Gallu
Desconectado
Mensajes: 247
|
No te parece que estás "mal gastando " memoria ? que sucede cuando la palabra ingresada no es de 50 caracteres , en todo caso 50 caracteres ya me suena a frase , quedaría mejor si reservas la memoria necesaria para el tamaño especifico de cada palabra ...
|
|
|
En línea
|
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
|
|
|
newfag
Desconectado
Mensajes: 7
|
No te parece que estás "mal gastando " memoria ? que sucede cuando la palabra ingresada no es de 50 caracteres , en todo caso 50 caracteres ya me suena a frase , quedaría mejor si reservas la memoria necesaria para el tamaño especifico de cada palabra ... hmm tienes razón, quedaría algo así, pero no se me ocurre otra manera de hacerlo que poner una variable auxiliar de 20 caracteres :S EDIT: al usar la funcion strlen lo se incluye el terminador de la cadena, por eso pongo strlen(aux)+1 #include<stdio.h> #include<stdlib.h> #include<string.h>
main() { int n,i; char **vect,aux[20]; printf("Nº palabras: "); scanf("%d" ,&n);
vect=(char **)calloc(sizeof(char*),n); for(i=0;i<n;i++) { printf("palabra: "); scanf("%s" ,aux); vect[i]=(char*)malloc(sizeof(char)*(strlen(aux)+1)); strcpy(vect[i],aux); }
for(i=0;i<n;i++) printf("%s\n", vect[i]); }
|
|
« Última modificación: 18 Mayo 2010, 17:41 pm por newfag »
|
En línea
|
|
|
|
Gallu
Desconectado
Mensajes: 247
|
Así esta muy bien , recuerda que la variable auxiliar tambien podria se dinamica char *aux = (char *) malloc(sizeof(char)*20);
al final solo tendrías que liberar toda la memoria que pediste ...
|
|
|
En línea
|
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
|
|
|
newfag
Desconectado
Mensajes: 7
|
Así esta muy bien , recuerda que la variable auxiliar tambien podria se dinamica char *aux = (char *) malloc(sizeof(char)*20);
al final solo tendrías que liberar toda la memoria que pediste ... jop eso de poner la aux con memoria dinámica ya es ajustar mucho eh? jaja pero si que tienes razón, muchisimas gracias por la ayuda, de verdad, estaba un poco perdido
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.958
Israel nunca torturó niños, ni lo volverá a hacer.
|
Mas importante seria que no tuviera posibles agujeros de seguridad, como escribir mas caracteres que los reservados ... lo podes solucionar con fgets (con stdin) + sscanf.
PD. Lo ideal es evitar siempre el uso de scanf (para no ensuciar el buffer).
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
newfag
Desconectado
Mensajes: 7
|
y también tendría que comprobar si la reserva de memoria se hace bien y no devuelve NULL, pero era solo para practicar ese tema un poco, no quiero hacer un programa serio serio. de todas maneras yo suelo usar scanf, pero uso siempre antes el __fpurge(stdin), para no coger cosas raras.
|
|
|
En línea
|
|
|
|
nicolasblues86
Desconectado
Mensajes: 38
|
no entiendo para que haces que 'vect' sea un puntero de puntero si lo que queres hacer es reserva la cantidad justa de memoria para la cantidad de palabras ingresadas, se puede hacer que vect sea tan solo un puntero a char : para empezar te quisiera corregir un pequeño error, cuando pones vect = (char*) calloc(sizeof(char),n );
no esta del todo bien, deberías poner: vect = (char*) calloc(n , sizeof(char) );
es decir ponías los parámetros al revés puntero = (tipo*) calloc (numero de elementos, tamaño de cada elemento)con esto reservarías la cantidad de mem justa que necesitas con respecto a hacer mas dinámico el programa y no tener que ingresar el numero de la cantidad de palabras, podrías usar fgets : int ext; char* vect; char cadena[50]; fgets (cadena , 50, stdin ); ext = strlen(cadena ) + 1// se le suma uno porque se cuenta el fin de cadena vect = (char*) calloc(ext , sizeof(char) );
Bueno creo que eso es todo Saludos
|
|
« Última modificación: 19 Mayo 2010, 04:37 am por nicolasblues86 »
|
En línea
|
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Asignacion Dinamica Memoria
Programación C/C++
|
charmedever
|
5
|
3,728
|
21 Octubre 2011, 05:25 am
por charmedever
|
|
|
Ayuda! Por favor. Tengo problema con memoria dinámica en c++ y función getline
Programación C/C++
|
DeathStar92
|
0
|
2,268
|
25 Noviembre 2012, 19:56 pm
por DeathStar92
|
|
|
Problema con asignación de memoria en puntero de caracteres.
Programación C/C++
|
1t4h1s4
|
9
|
5,234
|
13 Febrero 2013, 02:58 am
por 1t4h1s4
|
|
|
asignacion dinamica de memoria
Programación C/C++
|
d91
|
2
|
2,462
|
1 Junio 2014, 05:09 am
por Drewermerc
|
|
|
asignación dinámica de memoria y strcpy
Programación C/C++
|
m@o_614
|
3
|
2,901
|
5 Junio 2014, 22:42 pm
por leosansan
|
|