Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juanma97 en 23 Febrero 2017, 10:47 am



Título: Funcion strcpy() propia
Publicado por: juanma97 en 23 Febrero 2017, 10:47 am
Hola, soy nuevo en el foro, estoy haciendo la funcion strcpy() de C pero a mano, es decir por mi cuenta, lo que no logro es que copie la cadena s2 en s1 y le he dado mil vueltas pero no se como, ¿alguna ayuda? Gracias.

Código
  1. char* mi_strcpy(char* s1, char* s2){
  2. char* puntero = s1;
  3.    while(*s2 != '\0'){
  4. *puntero = *s2;
  5. puntero++;
  6. s2++;
  7.    }
  8. *puntero = '\0';
  9. return s1;
  10. }
  11.  
  12. void test_mi_strcpy()
  13.    {
  14. char* s1 = "abcdefgh";
  15. char s2 [8];
  16. INICIO_TEST("mi_strcpy");
  17. DebeSerCierto(mi_strcpy(s2, s1) == "abcdefgh");
  18. FIN_TEST("mi_strcpy");
  19.    }


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Funcion strcpy() propia
Publicado por: ivancea96 en 23 Febrero 2017, 12:10 pm
Hay un problema, y es que no puedes comparar 2 cadenas (char*) con ==. (Son punteros, no cadenas realmente)

Código
  1. DebeSerCierto(mi_strcpy(s2, s1) == "abcdefgh");

Si lo que queires es probar, haz un printf de la cadena copiada y listo.


Título: Re: Funcion strcpy() propia
Publicado por: engel lex en 23 Febrero 2017, 12:14 pm
Código
  1. char* s1 = "abcdefgh";
  2. char s2 [8];

esto va a desbordarcuando lleque al \0 de s1 (el noveno caracter), escribirá la memoria fuera de s2


Título: Re: Funcion strcpy() propia
Publicado por: juanma97 en 23 Febrero 2017, 15:50 pm
Me sigue generando fallo, el metodo no me funciona, lo que hice fue:
Código
  1. DebeSerCierto(strequals(s2,s1), "abcdefgh");


Título: Re: Funcion strcpy() propia
Publicado por: ivancea96 en 23 Febrero 2017, 16:21 pm
No sé qué hace la función DebeSerCierto, así que insisto, saca por pantalla la nueva cadena y compruébalo tú mismo primero.
Y fíjate en lo que dijo engel lex.


Título: Re: Funcion strcpy() propia
Publicado por: BloodSharp en 23 Febrero 2017, 21:53 pm
Puedes probar la función de ReactOS...

https://doxygen.reactos.org/d4/d17/utclib_8c_source.html#l00231

Código
  1. /*******************************************************************************
  2. *
  3. * FUNCTION:    strcpy
  4. *
  5. * PARAMETERS:  DstString       - Target of the copy
  6. *              SrcString       - The source string to copy
  7. *
  8. * RETURN:      DstString
  9. *
  10. * DESCRIPTION: Copy a null terminated string
  11. *
  12. ******************************************************************************/
  13. char *
  14. char                    *DstString,
  15. const char              *SrcString)
  16. {
  17.  char  *String = DstString;
  18.  
  19.   /* Move bytes brute force */
  20.  while (*SrcString)
  21.  {
  22.    *String = *SrcString;
  23.    String++;
  24.    SrcString++;
  25.  }
  26.  /* Null terminate */
  27.  *String = 0;
  28.  return (DstString);
  29. }


B#


Título: Re: Funcion strcpy() propia
Publicado por: ivancea96 en 23 Febrero 2017, 22:09 pm
Es exactamente la misma función.

En cualquier caso, el problema es su forma de comprobarlo, no la función, que es correcta.


Título: Re: Funcion strcpy() propia
Publicado por: BloodSharp en 24 Febrero 2017, 01:40 am
Un pequeño detalle con respecto al código que ahora lo miré bién:

Código
  1. (...)
  2. char* s1 = "abcdefgh";
  3. (...)
  4. DebeSerCierto(mi_strcpy(s2, s1) == "abcdefgh");
  5. (...)

No estás comparando los mismos strings directamente, sinó que estás comparando 2 direcciones de memoria distintas, el s1 apunta a una dirección en alguna sección "data" y el segundo "abcdefgh" estará apuntando a otra...

Para solucionarlo:

Código
  1. //variable global
  2. char stringComparar[]="abcdefgh";
  3.  
  4. función()
  5. {
  6.  char*s1=stringComparar;
  7.  (...)
  8.  DebeSerCierto(mi_string(s2,s1)==stringComparar;
  9.  (...)
  10. }

Edit: el resultado de "ser cierto" también creo que debería fallar porque estarías retornando la dirección de la variable de s2 que se encuentra en la pila, para comparar contenido de strings se recomienda funciones como strcmp y memcmp y/o sus variantes seguras...


B#