NOD32
 
     
 
Ultimas noticias ... Shell Security  
     
Foro de Shell Security :: Ver tema - Problemas de memoria
LoginNombre de UsuarioContraseña
Entrar automáticamente en cada visita    
Registrarse
Registrarse
Entre para ver sus mensajes privados
Entre para ver sus mensajes privados
Foros de discusión » Programación segura

Publicar nuevo tema   Responder al tema
Problemas de memoria
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Blue_box
Shell Level 1
Shell Level 1


Registrado: 12 Oct 2005
Mensajes: 12

MensajePublicado: Dom Abr 09, 2006 5:37 am    Asunto: Problemas de memoria Responder citando

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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Publicar nuevo tema   Responder al tema    Foros de discusión » Programación segura Todas las horas son GMT + 1 Hora
Página 1 de 1

 
Cambiar a:  
Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro

Seguridad informatica
Foro de Shell Security © 2003 ~ 2005. Tecnología phpbb