Funcion strcpy() propia

Iniciado por juanma97, 23 Febrero 2017, 10:47 AM

0 Miembros y 1 Visitante están viendo este tema.

juanma97

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.

char* mi_strcpy(char* s1, char* s2){
char* puntero = s1;
   while(*s2 != '\0'){
*puntero = *s2;
puntero++;
s2++;
   }
*puntero = '\0';
return s1;
}

void test_mi_strcpy()
   {
char* s1 = "abcdefgh";
char s2 [8];
INICIO_TEST("mi_strcpy");
DebeSerCierto(mi_strcpy(s2, s1) == "abcdefgh");
FIN_TEST("mi_strcpy");
   }



· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

ivancea96

Hay un problema, y es que no puedes comparar 2 cadenas (char*) con ==. (Son punteros, no cadenas realmente)

DebeSerCierto(mi_strcpy(s2, s1) == "abcdefgh");

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

engel lex

char* s1 = "abcdefgh";
char s2 [8];


esto va a desbordarcuando lleque al \0 de s1 (el noveno caracter), escribirá la memoria fuera de s2
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

juanma97

Me sigue generando fallo, el metodo no me funciona, lo que hice fue:
DebeSerCierto(strequals(s2,s1), "abcdefgh");

ivancea96

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.

BloodSharp

Puedes probar la función de ReactOS...

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

/*******************************************************************************
*
* FUNCTION:    strcpy
*
* PARAMETERS:  DstString       - Target of the copy
*              SrcString       - The source string to copy
*
* RETURN:      DstString
*
* DESCRIPTION: Copy a null terminated string
*
******************************************************************************/
char *
strcpy (
char                    *DstString,
const char              *SrcString)
{
 char  *String = DstString;
 
  /* Move bytes brute force */
 while (*SrcString)
 {
   *String = *SrcString;
   String++;
   SrcString++;
 }
 /* Null terminate */
 *String = 0;
 return (DstString);
}



B#



ivancea96

Es exactamente la misma función.

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

BloodSharp

#7
Un pequeño detalle con respecto al código que ahora lo miré bién:

(...)
char* s1 = "abcdefgh";
(...)
DebeSerCierto(mi_strcpy(s2, s1) == "abcdefgh");
(...)


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:

//variable global
char stringComparar[]="abcdefgh";

función()
{
 char*s1=stringComparar;
 (...)
 DebeSerCierto(mi_string(s2,s1)==stringComparar;
 (...)
}


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#