Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: newfag en 18 Mayo 2010, 16:30 pm



Título: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: newfag 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]);
}




Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 18 Mayo 2010, 16:38 pm
Ahi estas reservando memoria para una sola palabra de n caracteres  ;)


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: newfag 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]);
}


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Gallu 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 ... :-\


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: newfag 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]);
}


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Gallu 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 ... ;)


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: newfag 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 :)


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol 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).


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: newfag 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.


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 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


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: .:BlackCoder:. en 19 Mayo 2010, 04:30 am
Ya que hablas de hacerlo en un solo puntero y sin saber la cantidad de palabras, yo lo estoy intentando con c++ y no me sale  :( Yo crei que ya entendia el tema xD, pero me toco usar un poco de variables auxiliares, y a la final no me muestra nada... Como lo harias tu??...

Saludos...


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 en 19 Mayo 2010, 04:48 am
y una forma es como te mostré recién usando fgets y utilizando un variable auxiliar...

de ultima si tenes problemas con el nuevo codigo que estas haciendo postealo y nos fijamos porque no imprime nada


Saludos Coridiales :D
       


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: .:BlackCoder:. en 19 Mayo 2010, 06:05 am
Estoy con C++, no con C... Y aca ta el codigo... El problema es que no sale del bucle, de resto creo que funciona, pero sobrecargado de codigo  :-\:

Código
  1.    char *cad,aux[20]="",*caux;
  2.    int x=0;
  3.  
  4.    while (aux != "bye"){
  5.        x=x+strlen(aux)+1;
  6.        aux[strlen(aux)+1]=' ';
  7.        caux=cad;
  8.        cad=new char [x];
  9.        cad=caux;
  10.        int z=0;
  11.        for (int i=x-strlen(aux)-1;i<x;i++){
  12.            cad[i]=aux[z];
  13.            z++;
  14.            }
  15.        cin>>aux;
  16.    }
  17.    cout<< cad <<endl;
  18.    delete[] caux;
  19.    delete[] cad;
Bueno espero alguien me pueda ayudar... Y pes que a quien no le moleste expongan un mejor algoritmo...

Saludos...


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 19 Mayo 2010, 08:12 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 :

Es lo logico, un array bidimensional es un doble puntero. Mostranos en tu caso como leerias las palabras y accederias a ellas posteriormente ...


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: newfag en 19 Mayo 2010, 08:22 am
@nicolasblues86:
tienes razón con lo de calloc, el orden está mal puesto, pero si no supiera de antemano las palabras que voy a meter se podría usar la función  realloc para que fuera modificando el tamaño de vect.
EDIT: tal que asi


Código:
vect=(char **)calloc(1,sizeof(char*));
 do {
  printf("palabra: ");
  __fpurge(stdin);
  scanf("%s" ,aux);
  if(strcmp(aux,"fin")
    {
     vect[i]=(char*)malloc(sizeof(char)*(strlen(aux)+1));
     strcpy(vect[i],aux);
     n++;
     i++;
     vect=(char**)realloc(vect,sizeof(char*)*(n+1));
    }
}while(strcmp(aux,"fin"));



Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 en 19 Mayo 2010, 17:04 pm
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 :

Es lo logico, un array bidimensional es un doble puntero. Mostranos en tu caso como leerias las palabras y accederias a ellas posteriormente ...

sigo sin entender, ya se que un array bidimensional es un doble puntero, lo que no entiendo es para que sirve en este ejercicio en particular es complicarse la vida, si con un solo array dinámico se puede hacer tranquilamente el problema no exige mas que eso, salvo que yo lo alla entendido mal  :-\ pero hasta donde se es guardar palabras o mejor dicho una cadena en una array cuyo tamaño definimos en tiempo de ejecución, por eso digo que seria mas facil usar un array de una dimencion y extenderlo tanto como sea necesario de ultima lo que se puede hacer por cada linea que se escribe una fila diferente ahí si hace falta recurrir a la  bidimensionalidad    :

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define N 10
  6.  
  7. void entrada (char* cd[])
  8.  
  9. {
  10.  
  11. char aux[120];
  12. int j, tam;
  13.  
  14. printf ("escribe %d linea de texto \n", N );
  15. for (j = 0; j < N; j++)
  16. {
  17. fgets (aux, 120, stdin);
  18. tam = ((strlen(aux) +1) * sizeof(char)  );
  19. cd[j] =  (char*) malloc (tam);
  20. sscanf (aux, "%s", cd[j]);
  21. }
  22. }
  23.  
  24.  
  25. int main(int argc, char** argv)
  26. {
  27.  
  28. char * cad[N];
  29.  
  30. entrada (cad);
  31.  
  32.  
  33.  
  34. return 0;
  35. }
  36.  
  37.  
  38.  
  39.  









Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 19 Mayo 2010, 18:46 pm
Cita de: nicolasblues86
se puede hacer que vect sea tan solo un puntero a char :

Un puntero a char es lo que el tenia originalmente:
char *vect;

Vos ahora diste este ejemplo que es otra cosa:
char * cad[N];

sigo sin entender, ya se que un array bidimensional es un doble puntero, lo que no entiendo es para que sirve en este ejercicio en particular es complicarse la vida, si con un solo array dinámico se puede hacer tranquilamente el problema no exige mas que eso, salvo que yo lo alla entendido mal

En el ejemplo que das usas un array bidimensional de N punteros a caracter totalmente estatico, la solucion de newfag permite reservar la cantidad de punteros que quiera el usuario.

http://decsai.ugr.es/~jfv/ed1/c/cdrom/cap8/cap810.htm


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 en 19 Mayo 2010, 19:16 pm
obvio que estoy usando un array bidimensional, solo di ejemplo de como se podria llegar hacer usando ese método, sigo pensando que la manera mas sencilla  es con un array unimecional dinámico :

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int main(int argc, char** argv)
  7. {
  8. char* pt;
  9. int tam;
  10. char b[120];
  11.  
  12. fgets (b, 120, stdin);
  13. tam =  ((strlen (b) + 1 ) * sizeof(char) ) ;
  14. pt = (char*) malloc (tam);
  15.  
  16. /* Apartir de aca se treta a pt como si fuese un array normal */
  17.  
  18. return 0;
  19.  
  20. }
  21.  



OJO!!! yo no digo que esta sea la manera mas optima de hacerlo, solo digo que es la mas simple obviamente estamos limitados por 120 caracteres y tenemos reservado ese espacio estatico,  se puede profundizar mucho más pero la pregunta inicial iba a esto

Saludos Cordiles  



Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 19 Mayo 2010, 19:29 pm
obvio que estoy usando un array bidimensional, solo di ejemplo de como se podria llegar hacer usando ese método

No entiendo muy bien para que ... eso ya lo hizo newfag ... yo te habia pedido que dieras el ejemplo de lo que vos aconsejabas hacer.

sigo pensando que la manera mas sencilla  es con un array unimecional dinámico :

/* Apartir de aca se treta a pt como si fuese un array normal */

Esa parte es la que me gustaria ver, como lees digamos 300 palabras (o lineas que es en realidad lo que se planteaba en el codigo desde el principio, con un bucle para ello) y despues podes acceder a ellas. Ese codigo por lo pronto lee una sola palabra linea.

OJO!!! yo no digo que esta sea la manera mas optima de hacerlo, solo digo que es la mas simple obviamente estamos limitados por 120 caracteres y tenemos reservado ese espacio estatico,  se puede profundizar mucho más pero la pregunta inicial iba a esto

Yo no lo entendi esa manera y mucho menos despues de leer el codigo donde no se trataba de una cadena de X tamaño sino X numero de cadenas ...


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 en 19 Mayo 2010, 19:48 pm
Citar
Esa parte es la que me gustaria ver, como lees digamos 300 palabras y despues podes acceder a ellas. Ese codigo por lo pronto lee una sola palabra.


Heee?¿?¿?¿?¿?
que lee una sola palabra???... no capo! lee una cadena que es muy diferente en ella puede aver una palabra de 120 caracteres (la cual no existe) como tambien puede haber 50 palabras o 20 o una sola por eso uso fgets !!!  
 
a ver vamos por por partes aca ta el codigo:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int main(int argc, char** argv)
  6. {
  7. char* pt;
  8. int tam;
  9. char b[120];
  10.  
  11. fgets (b, 120, stdin);
  12. tam =  ((strlen (b) + 1 ) * sizeof(char) ) ;
  13. pt = (char*) malloc (tam);
  14.  
  15. /* Apartir de aca se treta a pt como si fuese un array normal */
  16.  
  17. return 0;
  18. }
  19.  


digamos que nosotros ingresamos "hola!! a todos com andan?? espero que bien.. chau"

el codigo reserva memoria para alamacenar esa cantidad de caracteres en pt

ahora si nosotros queremos ingresar esos caracteres en pt podriamos hacer por ejemplo:

Código
  1.  
  2. strcpy(pt, b);
  3. puts (pt); //muestra en contenido de pt
  4.  
  5.  
  6.  
  7.  




EI: juntando mensajes.

Citar
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

decime porfavor en que parte dice lo de numero indeterminado de lineas yo no lo veo
la propuesta inicial era esta que despues se haya deformado es otra cosa

Saludos!


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 19 Mayo 2010, 19:55 pm
Heee?¿?¿?¿?¿?
que lee una sola palabra???... no capo! lee una cadena que es muy diferente en ella puede aver una palabra de 120 caracteres (la cual no existe) como tambien puede haber 50 palabras o 20 o una sola por eso uso fgets !!!

Ver edicion (anterior en el tiempo a tu respuesta); igual eso NO acepta un numero indeterminado de palabras, tiene un limite fijo y por caracteres, primer mensaje:
"quiero hacer un programa que acepte un numero indeterminado de palabras y las imprima por pantalla"

Citar
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

Cita de: nicolasblues86
decime porfavor en que parte dice lo de numero indeterminado de lineas yo no lo veo  
la propuesta inicial era esta que despues se haya deformado es otra cosa

Saludos!

El codigo original intentaba hacer exactamente eso. ¿No? Y de cualquier manera la propuesta inicial implicaba un numero indeterminado de palabras que de esa manera no podes garantizar.


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 en 19 Mayo 2010, 20:09 pm

Citar
El codigo original intentaba hacer exactamente eso. ¿No?

no.. el codigo original del principio el numero determinado es ingresado de antemano por el usuario, se pide el numero el usuario lo ingresa y recién ahí reserva la memoria, cuando hablamos de numero indeterminado de palabras y ni el usuario sabe exatamente cuantas palabras va a escribir, mi codigo obiamente esta limitado por 120 caracteres, pero te repito yo nunca dije que era la manera mas obtima sino la mas sencilla   
 


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 19 Mayo 2010, 20:11 pm

Citar
El codigo original intentaba hacer exactamente eso. ¿No?

no.. el codigo original del principio el numero determinado es ingresado de antemano por el usuario, se pide el numero el usuario lo ingresa y recién ahí reserva la memoria, cuando hablamos de numero indeterminado de palabras y ni el usuario sabe exatamente cuantas palabras va a escribir, mi codigo obiamente esta limitado por 120 caracteres, pero te repito yo nunca dije que era la manera mas obtima sino la mas sencilla    
 

Si, el codigo original intenta leer X veces y lo hace de manera tal que de funcionar leeria X lineas. El numero es INDETERMINADO para el programador en tiempo de compilacion ...


Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: nicolasblues86 en 19 Mayo 2010, 20:39 pm
jajaja

Alta discusión!! :D

en algo si te voy a dar la razón, ahora ya que leí bien detenidamente todo!

si es verdad que en un principio se quiere hacer con lineas (y pido perdón por eso me deje levar por lo picante de la discusión :D), 

pero en algo me tenes que dar la derecha en el codigo que puse anteriormente el numero de palabras tambien es indeterminado, limitado, pero indeterminado, uno puede poner tanto  como 5,  6  o  30 palabras , no vas a poder poner mil claro está, asi que en esencia se cumple lo de indeterminado.


Saludos Cordiales 




Título: Re: Ayuda asignacion de memoria dinámica palabras en c
Publicado por: Eternal Idol en 19 Mayo 2010, 20:42 pm
jajaja

Alta discusión!! :D

en algo si te voy a dar la razón, ahora ya que leí bien detenidamente todo!

si es verdad que en un principio se quiere hacer con lineas (y pido perdón por eso me deje levar por lo picante de la discusión :D)

No problem.

pero en algo me tenes que dar la derecha en el codigo que puse anteriormente el numero de palabras tambien es indeterminado, limitado, pero indeterminado, uno puede poner tanto  como 5,  6  o  30 palabras , no vas a poder poner mil claro está, asi que en esencia se cumple lo de indeterminado.

Aceptado.

Estamos de acuerdo  ;-) ::)