Foros del Web » Programación para mayores de 30 ;) » C/C++ »

¿Que hay de mal en estas funciones?

Estas en el tema de ¿Que hay de mal en estas funciones? en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/08/2012, 17:49
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
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
  #2 (permalink)  
Antiguo 07/08/2012, 19:14
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
Puntos: 8
Respuesta: ¿Que hay de mal en estas funciones?

Lo arregle agregandole +1 a los calloc de las funciones.

Código C:
Ver original
  1. //CadLong+1
  2. int GetCadPos(char* txt, char* cad, int startpos)
  3. {
  4.     ...
  5.     ...
  6.     char* tmp = (char*)calloc(CadLong+1, sizeof(char));
  7.     ...
  8.     ...
  9. }
  10.  
  11. //(CadenaLong+ExtraSize)+1
  12. char* ReplaceBetween(char* cadena, char* inicio, char* fin, char* remplazar)
  13. {
  14.     ...
  15.     ...
  16.     char* NewCad = (char*)calloc((CadenaLong+ExtraSize)+1, sizeof(char));
  17.     ...
  18.     ...
  19. }
  20. //(Pos_F-Pos_I)+1
  21. char* GetCadBetween(char* cadena, char* inicio, char* fin)
  22. {
  23.    ...
  24.    ...
  25.     char* NewCad = (char*)calloc((Pos_F-Pos_I)+1, sizeof(char));
  26.    ...
  27.    ...
  28. }

Todavía tengo poca experiencia manejando arrays :S
  #3 (permalink)  
Antiguo 07/08/2012, 22:42
 
Fecha de Ingreso: septiembre-2003
Mensajes: 20
Antigüedad: 20 años, 8 meses
Puntos: 2
Respuesta: ¿Que hay de mal en estas funciones?

¿Es necesario que programes en C?, porque no convierte ese programa en C++ y utilizas la STL (Standard Template Library) la cual te facilita el manejo de cadenas, arreglos dinámicos, etc y la necesidad de estar utilizado punteros así evitas los famosos “Memory leak”.

http://www.zator.com/Cpp/E5.htm

Y por el rendimiento que se pierde usando C++ +-5% es casi nada comparado a lo que vas a ganar en productividad.
  #4 (permalink)  
Antiguo 07/08/2012, 23:20
Avatar de ipraetoriux  
Fecha de Ingreso: abril-2010
Ubicación: ipraetoriux.com
Mensajes: 1.125
Antigüedad: 14 años
Puntos: 155
Respuesta: ¿Que hay de mal en estas funciones?

Desgraciado:

Pues no estoy muy de acuerdo contigo, C ha sido la base de numerosos lenguajes de programacion, sirve como plataforma de formacion educativa, y al dia de hoy, sigue siendo un lenguaje MUY usado especialmente dentro del mundo Linux y Juegos...lo que pasa que como esta un poco de moda en la web habar de OOP, clases, objetos, etc, se cree que C++ ha sepultado a C, pues no...van en paralelo. Obviamente dependo mucho en que estemos trabajando o a donde estamos orientados...
  #5 (permalink)  
Antiguo 08/08/2012, 02:01
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: ¿Que hay de mal en estas funciones?

Hola.

Estoy de acuerdo con ipraetoriux en la vigencia de C, basta echar una ojeada a TIOBE ( http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html ) para confirmarlo. Pero también es cierto que el manejo de cadenas se ha simplificado enormemente en C++.

Por cierto, algunas funciones se pueden escribir de forma más compacta y eficiente utilizando punteros:
Código C:
Ver original
  1. int length_str(char *str) {
  2. char *t = str;
  3.   while(*t) t++;
  4.   return t-str;
  5. }
  6.  
  7. int compare_str(char *a, char *b) {
  8.   for(; *a == *b; a++,b++)
  9.     if (*a == '\0') return 0;
  10.    return *a - *b;
  11. }


Saludos.

Última edición por ecfisa; 08/08/2012 a las 02:10 Razón: No me funcionan las etiquetas: [URL] [/URL]
  #6 (permalink)  
Antiguo 09/08/2012, 01:18
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
Puntos: 8
Respuesta: ¿Que hay de mal en estas funciones?

Cita:
Iniciado por ecfisa Ver Mensaje
Hola.

Estoy de acuerdo con ipraetoriux en la vigencia de C, basta echar una ojeada a TIOBE ( http://www.tiobe.com/index.php/conte...pci/index.html ) para confirmarlo. Pero también es cierto que el manejo de cadenas se ha simplificado enormemente en C++.

Por cierto, algunas funciones se pueden escribir de forma más compacta y eficiente utilizando punteros:
Código C:
Ver original
  1. int length_str(char *str) {
  2. char *t = str;
  3.   while(*t) t++;
  4.   return t-str;
  5. }
  6.  
  7. int compare_str(char *a, char *b) {
  8.   for(; *a == *b; a++,b++)
  9.     if (*a == '\0') return 0;
  10.    return *a - *b;
  11. }


Saludos.
Muchas gracias por tu respuesta :D.
La razón por la que uso C, es por que leí que tiene buen rendimiento, ademas es como digamos casi la base de toda la programación moderna (La base supongo que es assembler), me gusta usarlo.
Otra duda que es un poco tonta.
¿Es verdad que C tiene un poco mas de rendimiento en cuanto a velocidad que C++?

Última edición por Doommarine_Maxi; 09/08/2012 a las 01:19 Razón: Ortografia
  #7 (permalink)  
Antiguo 09/08/2012, 13:09
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: ¿Que hay de mal en estas funciones?

Hola Doommarine_Maxi.

No creo que pueda darse una respuesta absoluta al rendimiento C vs C++. Depende de factores como por ejemplo el código y compilador que se usen. He leido por allí que C es un poco más veloz, pero la diferencia no era significativa.

Lo más importante a la hora de elegir un lenguaje es a que taréa se lo va a aplicar, por ejemplo; nada más rápido que un programa generado en ensamblador. Pero nadie con buén sentido desarrollaría un sistema de gestión en ese lenguaje, por que estaríamos pagando la ganancia en velocidad x1000 en complejidad y tiempo de desarrollo. También es improbable que alguién que programe interfaces para el S.O. se decida por utilizar COBOL.

Tanto C como C++ tiene sus defensores y detractores (como tantos otros lenguajes) pero en líneas generales creo que no hay buenos o malos lenguajes. Hay buenos o malos programadores o tal vez buenas o malas elecciones del lenguaje a aplicar.


Cita:
me gusta usarlo
Ese es uno de los más valederos de los motivos; sentirse cómodo, afín con el lenguaje es muy importante.
Por otro lado si manejas C, sólo tendrás que aprender lo referente a la orientación a objetos de C++ y algunos puntos más para usarlo. Ya que luego, las diferencias entre ambos no son abismales.

Saludos.

Etiquetas: funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:08.