elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda asignacion de memoria dinámica palabras en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda asignacion de memoria dinámica palabras en c  (Leído 13,876 veces)
newfag

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Ayuda asignacion de memoria dinámica palabras en c
« en: 18 Mayo 2010, 16:30 pm »

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

Código:
#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 Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #1 en: 18 Mayo 2010, 16:38 pm »

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 Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #2 en: 18 Mayo 2010, 16:41 pm »

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
Código:
#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 Desconectado

Mensajes: 247



Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #3 en: 18 Mayo 2010, 17:17 pm »

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 Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #4 en: 18 Mayo 2010, 17:39 pm »

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

Código:
#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 Desconectado

Mensajes: 247



Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #5 en: 18 Mayo 2010, 17:49 pm »

Así esta muy bien , recuerda que la variable auxiliar tambien podria se dinamica
Código
  1. char *aux = (char *) malloc(sizeof(char)*20);
  2.  
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 Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #6 en: 18 Mayo 2010, 17:53 pm »

Así esta muy bien , recuerda que la variable auxiliar tambien podria se dinamica
Código
  1. char *aux = (char *) malloc(sizeof(char)*20);
  2.  
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 Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #7 en: 18 Mayo 2010, 18:12 pm »

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 Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #8 en: 18 Mayo 2010, 18:30 pm »

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 Desconectado

Mensajes: 38



Ver Perfil
Re: Ayuda asignacion de memoria dinámica palabras en c
« Respuesta #9 en: 19 Mayo 2010, 04:19 am »

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

Código
  1.  
  2.  
  3. vect = (char*) calloc(sizeof(char),n);
  4.  
  5.  

no esta del todo bien, deberías poner:

Código
  1.  
  2.  
  3. vect = (char*) calloc(n, sizeof(char) );
  4.  
  5.  

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 :

Código
  1.  
  2. int ext;
  3. char* vect;
  4. char cadena[50];
  5.  
  6. fgets (cadena, 50, stdin );
  7.  
  8. ext = strlen(cadena) + 1// se le suma uno porque se cuenta el fin de cadena
  9.  
  10. vect = (char*) calloc(ext, sizeof(char) );
  11.  
  12.  


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
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines