Blue_box Shell Level 1

Registrado: 12 Oct 2005 Mensajes: 12
|
Publicado: Dom Abr 09, 2006 5:37 am Asunto: Problemas de memoria |
|
|
Qué tal les cuento rápido.
Esto haciendo un programa que sea capaz de leer una cadena de texto qu puede ser algo como:
"Estando en el camino, de frente a mi destino consumiendo mi alma, la rutina me arranca cada trozo de mi alma."
Etc. Lo que tiene que hacer es mostrarme las diferentes palabras que haya dentro de la frase e indicarme cuantas veces se ha repetido, pero si ya ha impreso una palabra por ejemplo "de" ya no puedo volver a imprimir dicha palabra si la encuentra más adelante en el texto.
Mi programa:
| Código: |
#include <string.h>
#include <iostream>
using namespace std;
#define Espacio 500
int main(void)
{
char *frase;
int repetidos;
if((frase=(char *)malloc(sizeof(char)*Espacio))==NULL) //memoria
{ cout<<"\n Error al asignar la memoria dinamica. \n"; system("pause"); exit(1); }
cout<<"\n Introduce una frase: ";
gets(frase);
if((frase=(char *)realloc(frase,sizeof(char)*strlen(frase)+1))==NULL) //libera memoria no utilizada
{ cout<<"\n Error al reasignar la memoria dinamica. \n"; system("pause"); exit(1); }
int cont=-1,espacios=0,aux;
while(frase[cont]==' ' && ++cont); //ignora los espacios al principio de la frase
while(frase[++cont] && cont<strlen(frase)) //cuenta las palabras y no admite numeros
{
if(frase[cont]==' ' && isalpha(frase[cont+1])) ++espacios;
if(isdigit(frase[cont])) { cout<<"\n Error la frase contiene numeros. \n"; system("pause"); exit(1); }
}
char *palabras[espacios+1];
cont=-1; espacios=0;
while(++cont<strlen(frase)) //recorre la frase
while(cont<strlen(frase) && frase[cont]!=' ') //identifica solo las palabra
{
if((palabras[espacios]=(char *)malloc(sizeof(char)*2))==NULL) //pido memoria minima
{ cout<<"\n Error al asignar memoria dinamica para la palabra("<<espacios<<")."; system("pause"); exit(1); }
//////////////////////////////// Aqui sale el error ////////////////////////////
aux=-1;
do //copia la palabra de longitud desconocida
{
if((palabras[espacios]=(char *)realloc(palabras[espacios],sizeof(char)*strlen(palabras[espacios]+1)))==NULL)
{ cout<<"\n Error al reasignar memoria dinamica para la palabra("<<espacios<<"-"<<aux+1<<"). \n"; system("pause"); exit(1); }
palabras[espacios][++aux]=frase[cont];
}while(cont<strlen(frase) && frase[++cont]!=' ');
//////////////////////////////// Aqui sale el error ////////////////////////////
palabras[espacios][++aux]='\0';
++espacios;
}
for(cont=0;cont<espacios;cont++) //muestra la tabla
{
repetidos=0;
for(aux=cont+1;aux<espacios;aux++) //busca si la palabra esta repetida en la frase
if(!strcmp(palabras[cont],palabras[aux])) ++repetidos;
for(aux=cont-1;aux>=0;aux--) // si la palabra se repite más de 2 veces no la vuelve a imprimir
if(!strcmp(palabras[cont],palabras[aux])) { repetidos=-1; break; }
if(repetidos>=0) // imprime si es una nueva palabra este o no repetida
cout<<"\n Longitud: "<<strlen(palabras[cont])<<" Palabra: "<<palabras[cont]<< " Repeticiones: "<<repetidos;
}
system("pause");
return(1);
}
|
Bueno explicare esto a partes, el programa
En primer lugar reserva memoria para almacenar la frase. Después elimina la memoria no utilizada.
Después cuento el números de palabras dentro del texto ignorando espacios en blanco innecesarios y números dentro del texto(estos últimos terminan el programa.)
Seguido creo una variable en la cual le indico la cantidad de espacios a reservar de forma dinámica.
Leo el texto.
Después pido memoria suficiente para 1 carácter que sería el inicio de cada palabra.
Ya que tengo este espacio comienzo a almacenar la palabra puesto que no se la longitud de dicha palabra por cada carácter hasta un nuevo espacio en blanco reasigno espacio en memoria para dicha palabra. Así con cada una de las palabras dentro del texto.
Finalmente cuando tengo las palabras separadas, imprimo solo las palabras diferentes e indico cuantas veces se ha repetido para ello uso dos ciclos uno que recorre el texto hacia el frente, con lo cual traigo la cantidad de repeticiones y otro hacia atrás que me indica si esa palabra ya la había impreso anteriormente.
Mi problema para ser precisos surge cuando reasigno la memoria, justo aquí:
| Código: |
do //copia la palabra de longitud desconocida
{
if((palabras[espacios]=(char *)realloc(palabras[espacios],sizeof(char)*strlen(palabras[espacios]+1)))==NULL)
{ cout<<"\n Error al reasignar memoria dinamica para la palabra("<<espacios<<"-"<<aux+1<<"). \n"; system("pause"); exit(1); }
palabras[espacios][++aux]=frase[cont];
}while(cont<strlen(frase) && frase[++cont]!=' ');
|
Me tira el error de que no pudo reservar la memoria aun cuando es el primer carácter de la primer palabra.
Quisiera saber si este método que estoy utilizando es incorrecto o por que el programa es incapaz de reservar el espacio en memoria que le pido para cada palabra.
No les extrañe ver que no libero los punteros puesto que el programa no esta terminado, ya que no he podido reparar esta falla.
Uso Dev-c++. _________________ La evolución natural del ser humano es la unión de sus individuos en una sola entidad para alcalzar un objetivo en común; y no es el dominio de unos sobre otros. |
|