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 (http://foro.elhacker.net/reglas.htm)
-Engel Lex
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.
char* s1 = "abcdefgh";
char s2 [8];
esto va a desbordarcuando lleque al \0 de s1 (el noveno caracter), escribirá la memoria fuera de s2
Me sigue generando fallo, el metodo no me funciona, lo que hice fue:
DebeSerCierto(strequals(s2,s1), "abcdefgh");
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.
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#
Es exactamente la misma función.
En cualquier caso, el problema es su forma de comprobarlo, no la función, que es correcta.
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#