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]);
}
Ahi estas reservando memoria para una sola palabra de n caracteres ;)
Cita de: Eternal Idol en 18 Mayo 2010, 16:38 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
#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]);
}
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 ... :-\
Cita de: Didacso 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 ... :-\
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]);
}
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 ... ;)
Cita de: Didacso en 18 Mayo 2010, 17:49 PM
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 :)
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).
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.
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
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...
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
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 :-\:
char *cad,aux[20]="",*caux;
int x=0;
while (aux != "bye"){
x=x+strlen(aux)+1;
aux[strlen(aux)+1]=' ';
caux=cad;
cad=new char [x];
cad=caux;
int z=0;
for (int i=x-strlen(aux)-1;i<x;i++){
cad[i]=aux[z];
z++;
}
cin>>aux;
}
cout<< cad <<endl;
delete[] caux;
delete[] cad;
Bueno espero alguien me pueda ayudar... Y pes que a quien no le moleste expongan un mejor algoritmo...
Saludos...
Cita de: 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 :
Es lo logico, un array bidimensional es un doble puntero. Mostranos en tu caso como leerias las palabras y accederias a ellas posteriormente ...
@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
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"));
Cita de: Eternal Idol en 19 Mayo 2010, 08:12 AM
Cita de: 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 :
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 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
void entrada (char* cd[])
{
char aux[120];
int j, tam;
printf ("escribe %d linea de texto \n", N );
for (j = 0; j < N; j++)
{
fgets (aux, 120, stdin);
tam = ((strlen(aux) +1) * sizeof(char) );
cd[j] = (char*) malloc (tam);
sscanf (aux, "%s", cd[j]);
}
}
int main(int argc, char** argv)
{
char * cad[N];
entrada (cad);
return 0;
}
Cita de: nicolasblues86se 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];
Cita de: nicolasblues86 en 19 Mayo 2010, 17:04 PMsigo 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
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 :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char* pt;
int tam;
char b[120];
fgets (b, 120, stdin);
tam = ((strlen (b) + 1 ) * sizeof(char) ) ;
pt = (char*) malloc (tam);
/* Apartir de aca se treta a pt como si fuese un array normal */
return 0;
}
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
Cita de: nicolasblues86 en 19 Mayo 2010, 19:16 PMobvio 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.
Cita de: nicolasblues86 en 19 Mayo 2010, 19:16 PMsigo 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.
Cita de: nicolasblues86 en 19 Mayo 2010, 19:16 PMOJO!!! 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 ...
CitarEsa 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:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char* pt;
int tam;
char b[120];
fgets (b, 120, stdin);
tam = ((strlen (b) + 1 ) * sizeof(char) ) ;
pt = (char*) malloc (tam);
/* Apartir de aca se treta a pt como si fuese un array normal */
return 0;
}
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:
strcpy(pt, b);
puts (pt); //muestra en contenido de pt
EI: juntando mensajes.
Citarbuenas, 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!
Cita de: nicolasblues86 en 19 Mayo 2010, 19:48 PMHeee?¿?¿?¿?¿?
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"
Cita de: nicolasblues86 en 19 Mayo 2010, 19:54 PM
Citarbuenas, 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.
CitarEl 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
Cita de: nicolasblues86 en 19 Mayo 2010, 20:09 PM
CitarEl 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 ...
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
Cita de: 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)
No problem.
Cita de: nicolasblues86 en 19 Mayo 2010, 20:39 PMpero 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 ;-) ::)