Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/08/2012, 17:49
Avatar de Doommarine_Maxi
Doommarine_Maxi
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 14 años
Puntos: 8
¿Que hay de mal en estas funciones?

Hola, pues estoy armando unas funciones para manejar mas cómodo las cadenas en C.
Y estoy teniendo un problema con este código.


Funciones de cadenas
Código C:
Ver original
  1. /*arrays.h*/
  2. #include <stdio.h>
  3.  
  4. int LongCad(char* cad)
  5. {
  6.     int x=0;
  7.     while(cad[x] != '\0')x++;
  8.     return x;
  9. }
  10. int GetCadPos(char* txt, char* cad, int startpos)
  11. {
  12.     int CadLong = LongCad(cad);
  13.     int TxtLong = LongCad(txt);
  14.     char* tmp = (char*)calloc(CadLong, sizeof(char));
  15.     int i;
  16.     int x;
  17.     for (i=startpos; i <= (TxtLong-CadLong); i++)
  18.     {
  19.         for (x=0; x < CadLong; x++)
  20.             tmp[x] = txt[i+x];
  21.         if (isSameCad(tmp, cad) == 1)
  22.             return i;
  23.     }
  24.     return -1;
  25. }
  26. int isSameCad(char* cad1, char* cad2)
  27. {
  28.     int Long1 = LongCad(cad1);
  29.     int Long2 = LongCad(cad2);
  30.     if (Long1 != Long2)
  31.         return 0;
  32.     int x;
  33.     for (x=0; x < Long2; x++)
  34.     {
  35.         if (cad1[x] != cad2[x])
  36.             return 0;
  37.     }
  38.     return 1;
  39. }
  40. char* ReplaceBetween(char* cadena, char* inicio, char* fin, char* remplazar)
  41. {
  42.     int Pos_I = GetCadPos(cadena, inicio, 0)+(LongCad(inicio)-1);
  43.     int Pos_F = GetCadPos(cadena, fin, Pos_I);
  44.     int rLong = LongCad(remplazar)-1;
  45.     int ExtraSize = rLong - (Pos_F-Pos_I);
  46.     int CadenaLong = LongCad(cadena);
  47.     char* NewCad = (char*)calloc((CadenaLong+ExtraSize), sizeof(char));
  48.    
  49.     int x;
  50.     for (x=0; x <= Pos_I; x++)
  51.         NewCad[x] = cadena[x];
  52.     int y=x;
  53.     int i;
  54.     int z;
  55.     for (i=0; i <= rLong; i++)
  56.         NewCad[y++] = remplazar[i];
  57.     for (z=Pos_F; z <= CadenaLong; z++)
  58.         NewCad[y++] = cadena[z];
  59.  
  60.     return NewCad;
  61. }
  62. char* ConstToCad(const char* cad)
  63. {
  64.     return (char *)(cad);
  65. }
  66. char* GetCadBetween(char* cadena, char* inicio, char* fin)
  67. {
  68.     int Pos_I = GetCadPos(cadena, inicio, 0)+(LongCad(inicio)-1);
  69.     int Pos_F = GetCadPos(cadena, fin, Pos_I);
  70.     char* NewCad = (char*)calloc((Pos_F-Pos_I)+1, sizeof(char));
  71.    // printf("%i\n", Pos_I);
  72.     int i;
  73.     int x=0;
  74.     for (i =Pos_I; i < Pos_F; i++)
  75.         NewCad[x++] = cadena[i];
  76.    
  77.     return NewCad;
  78. }

Main.c
Código C:
Ver original
  1. #include <stdio.h>
  2. #include "arrays.h"
  3. #ifdef WINDOWS
  4.     #include <direct.h>
  5.     #define GetCurrentDir _getcwd
  6. #else
  7.     #include <unistd.h>
  8.     #define GetCurrentDir getcwd
  9. #endif
  10.  
  11. void S_pause()
  12. {
  13.      char c;
  14.      do
  15.      {
  16.           c = getchar();
  17.      } while (c != '\n');    
  18. }
  19.  
  20. int main()
  21. {
  22.     char* cad2;
  23.     cad2 = ReplaceBetween(ConstToCad("Stealzps<Doom>Hola</Doom>"), ConstToCad("<Doom>"), ConstToCad("</Doom>"), "Soy el Doom 4");
  24.     printf("Prueba: %s\n", cad2); //Esto funciona bien
  25.     char* cad3;
  26.     cad3 = GetCadBetween(ConstToCad("Stealzps<Doom>Hola</Doom>"), ConstToCad("<Doom>"), ConstToCad("</Doom>"));
  27.     printf("Pueba2: %s", cad3);  //Esto no
  28.     S_pause();
  29.     return 0;
  30. }

Salida:
Stealzps<Doom>Soy el Doom 4</Doom>
y luego el programa se crashea o me devuelve
lzps<Doom>Soy el Doom 4

Definitivamente esta mal la funcion GetCadPos., pero no se en que.
Si pudieran ayudarme se los agradecería mucho :D