elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda codigo simple C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda codigo simple C  (Leído 2,636 veces)
73P3

Desconectado Desconectado

Mensajes: 2


Ver Perfil
duda codigo simple C
« en: 23 Marzo 2021, 19:54 pm »

Hola, estoy tratando de hacer una funcion que copia los caracteres de una string en otra. el funcionamiento es igual que el de la funcion strcpy() pero no puedo usarla. tengo lo siguiente:

Código
  1. char *mi_strcpy(char *cadena1, char *cadena2) {
  2.  
  3.    for(int i=0; i < strlen(cadena2); i++) {
  4.        cadena1[i] = cadena2[i];
  5.    }
  6.    cadena2[strlen(cadena2)]  = '\0';
  7.  
  8.    return cadena1;
  9. }

el problema es que si la cadena2 es menor que la cadena 1, el resto de la longitud de s1 se completa con sus elementos. Ejemplo:
Cadena1 = Hola
Cadena2 = Si
Resultado = Sila


« Última modificación: 23 Marzo 2021, 20:09 pm por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: duda codigo simple C
« Respuesta #1 en: 23 Marzo 2021, 20:10 pm »

Linea 6, pones el 0 terminador de cadena2 de acuerdo al tamaño de la propia cadena2, no cambia nada eso. Podrias borrar esa linea y ejecutar el bucle por una iteracion mas ...


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
73P3

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: duda codigo simple C
« Respuesta #2 en: 23 Marzo 2021, 20:12 pm »

muchas gracias
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: duda codigo simple C
« Respuesta #3 en: 23 Marzo 2021, 21:52 pm »

Tienes que estudiar las posibilidades que existen y lo que debería hacer tu función en cada caso:
  • Caso 1: strlen(cadena1) < strlen(cadena2) -> Copia tantos caracteres como tenga cadena1
Código:
cadena1 = Hola
cadena2 = Adios
resultado -> cadena1 = Adio

  • Caso 2: strlen(cadena1) = strlen(cadena2) -> Copia tantos caracteres como tengan ambas
Código:
cadena1 = Hola
cadena2 = aloH
resultado -> cadena1 = aloH

  • Caso 3: strlen(cadena1) > strlen(cadena2) -> Copia tantos caracteres como tenga cadena2 y corta la cadena
Código:
cadena1 = Adios
cadena2 = Hola
resultado -> cadena1 = Hola -> no cadena1 = Holas

Al final si sacamos un patrón de todo esto es que se copian tantos caracteres como tenga la cadena más corta de las dos y el siguiente caracter tiene que ser el de fin de cadena '\0'.
Para los casos 2 y 3 vistos antes bastaría con hacer la modificación que ha comentado @Eternal Idol porque la cadena más corta es cadena2; sin embargo, en el caso 1 nos generará problemas de acceso a memoria.

Para que funcione en todos los casos es necesario comprobar cuál es la cadena más corta de las dos:
Código
  1. char *my_strcpy(char *cadena1, char *cadena2) {
  2.  int longitud_minima = strlen(cadena1);
  3.  if(strlen(cadena2) < longitud_minima) longitud_minima = strlen(cadena2);
  4.  for(int i = 0; i <= longitud_minima; ++i) // la ultima iteracion servira para copiar el caracter '\0'
  5.    cadena1[i] = cadena2[i];
  6.  return cadena1;
  7. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: duda codigo simple C
« Respuesta #4 en: 23 Marzo 2021, 22:28 pm »

Al final si sacamos un patrón de todo esto es que se copian tantos caracteres como tenga la cadena más corta de las dos y el siguiente caracter tiene que ser el de fin de cadena '\0'.
Para los casos 2 y 3 vistos antes bastaría con hacer la modificación que ha comentado @Eternal Idol porque la cadena más corta es cadena2; sin embargo, en el caso 1 nos generará problemas de acceso a memoria.

Partiendo de:
Hola, estoy tratando de hacer una funcion que copia los caracteres de una string en otra. el funcionamiento es igual que el de la funcion strcpy() pero no puedo usarla.

No, el resultado del caso 1 esta mal, se deben copiar strlen de la cadena fuente + 1 (0 terminador). La funcion strcpy es insegura por naturaleza, si el buffer de destino no tiene suficiente espacio para copiar la fuente con su 0 terminador es un problema del llamador. Hay alternativas que reciben un tamaño maximo a usar como parametro ...

Citar
1) Copies the null-terminated byte string pointed to by src, including the null terminator, to the character array whose first element is pointed to by dest.
The behavior is undefined if the dest array is not large enough. The behavior is undefined if the strings overlap. The behavior is undefined if either dest is not a pointer to a character array or src is not a pointer to a null-terminated byte string.

https://en.cppreference.com/w/c/string/byte/strcpy

Seguramente las cadenas de destino en cuestion son simples arrays de caracteres donde anteriormente hubo informacion.

Código
  1. char b[128];
  2. strcpy(b, "Hola");
  3. strcpy(b, "Adios");
  4. //b no es Adio, es Adios

PD. Tu codigo, al menos, no funciona bien con un buffer no inicializado (strlen sobre destino es un error logico) ni con uno vacio (solo copia el primer caracter de la cadena fuente y no el 0 terminador).
« Última modificación: 23 Marzo 2021, 22:37 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Código más simple si es posible
.NET (C#, VB.NET, ASP)
Meta 5 3,699 Último mensaje 6 Diciembre 2009, 14:26 pm
por raul338
Ayuda con codigo c simple
Programación C/C++
Allitnam2004 6 3,378 Último mensaje 20 Septiembre 2010, 21:07 pm
por Allitnam2004
problema en simple codigo
Programación C/C++
elkiy 3 6,619 Último mensaje 26 Marzo 2013, 01:16 am
por avesudra
Duda con código simple (creo) en Ruby.
Scripting
Saito_25 2 2,182 Último mensaje 28 Marzo 2015, 20:18 pm
por Saito_25
MOVIDO: Duda con código simple (creo) en Ruby.
Programación General
Eleкtro 0 1,410 Último mensaje 29 Marzo 2015, 10:18 am
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines