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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Copiar arreglo de caracteres con Operador Igual
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Copiar arreglo de caracteres con Operador Igual  (Leído 4,495 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
[C] Copiar arreglo de caracteres con Operador Igual
« en: 21 Junio 2016, 22:13 pm »

Muy buen dia.

Algo que aprende el dia de ayer fue a copiar un arreglo de caracteres con el operador igual sin ayuda de memcpy o strcpy y derivados.

Segun el libro no es algo que se recomiende muy a menudo pero que por lo general indican produce un codigo de ensamblador muy optimizado.

Dadas 2 Cadenas de Igual longitud es posible copiar el contenido de una en otra con  el operador igual.

Código
  1. char cadena1[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  2. char cadena2[27] = {0};

Normalmente la operacion siguientearca error de compilacion.

Código
  1. cadena2 = cadena1;

Pero con ayuda de una estructura de datos de igual longitud:
Código
  1. struct X{
  2. char A[27];
  3. };
  4.  

podemos por ejemplo.

Código
  1. *(struct X*)cadena2=*(struct X*)cadena1;

Repito en el libro no lo recomiendan pero indican que si lo que buscas es optimizar un poco mas el codigo generado sería una opcion valida.

En el Libro muestran una funcion generica que hace una copia de bloques como el ejemplo mostrado para cualquier cantidad arbitraria de bytes.

En lo que llegue a la casa pongo el código mencionado.

Saludos.


« Última modificación: 22 Junio 2016, 14:20 pm por AlbertoBSD » En línea

fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #1 en: 22 Junio 2016, 14:16 pm »

Que buena Alberto  ;-) 

Código
  1. #include <stdio.h>
  2. #define MAX 5
  3.  
  4. struct Cadena
  5. {
  6.    char CantidadBytes[MAX];
  7. };
  8.  
  9. int main()
  10. {
  11.    char BufferOriginal[MAX] = "fary";
  12.    char BufferDestino[MAX] = {0};
  13.  
  14.    *(struct Cadena*)BufferDestino = *(struct Cadena*)BufferOriginal;
  15.  
  16.    printf("%s",BufferDestino);
  17.    return 0;
  18. }
  19.  


En línea

Un byte a la izquierda.
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #2 en: 25 Junio 2016, 00:51 am »

El libro menciona una funcion al estilo de memcpy llamada blockmove

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define BLOCKSIZE 256
  5. void blockmove(dest,src,count)
  6. register unsigned char *dest,*src;
  7. register unsigned count;
  8. {
  9. struct mblock{
  10. char a[BLOCKSIZE];
  11. };
  12. while(count >= BLOCKSIZE){
  13. *(struct mblock*)dest = *(struct mblock*)src;
  14. dest+=BLOCKSIZE;
  15. src+=BLOCKSIZE;
  16. count -= BLOCKSIZE;
  17. }
  18. while(count--)
  19. *dest++ = *src++;
  20. }
  21.  
  22. int main() {
  23. char A[1048],B[1048];
  24. memset(B,'C',1048-1);
  25. blockmove(A,B,1048);
  26. printf("%s\n",A);
  27.    return 0;
  28. }

Saludos!
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #3 en: 25 Junio 2016, 01:23 am »

Vale, igual se me ha ido un poco de las manos XDD

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. char cadena1[16] = "Hola";
  5. char cadena2[16];
  6.  
  7. *(char **)cadena2 = *(char **)cadena1;
  8.  
  9. fprintf(stdout, "%s\n", cadena1);
  10. fprintf(stdout, "%s\n", cadena2);
  11. fputc('\n', stdout);
  12. fprintf(stdout, "%p\n", cadena1);
  13. fprintf(stdout, "%p\n", cadena2);
  14.  
  15. return 0;
  16. }

Salida:
Código:
Hola
Hola

000000000023FE40
000000000023FE30

« Última modificación: 25 Junio 2016, 01:51 am por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #4 en: 25 Junio 2016, 01:48 am »

Código
  1. *(char **)&cadena2 = *(char **)&cadena1;

 ;-) ;-) ;-) ;-)

Esa si que no me la sabia, hay que ver que codigo de ASM produce para ver si hay diferencia.

Aun asi ese ejemplo solo copia 4 u 8 bytes no? Digo por el tamaño de un apuntador

Deja hago pruebas y lo veo.

Saludos!



Efectivamente solo copia bytes igual al tamaño de un apuntador:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main() {
  5. char cadena1[16];
  6. char cadena2[16];
  7.  
  8. memset(cadena1,'A',15);
  9. *(char **)&cadena2 = *(char **)&cadena1;
  10.  
  11. fprintf(stdout, "%s\n", cadena1);
  12. fprintf(stdout, "%s\n", cadena2);
  13. fputc('\n', stdout);
  14. fprintf(stdout, "%p\n", cadena1);
  15. fprintf(stdout, "%p\n", cadena2);
  16.  
  17. return 0;
  18. }

Salida

Código:
AAAAAAAAAAAAAAA
AAAAAAAA


000000000060FE40
000000000060FE30
« Última modificación: 25 Junio 2016, 01:52 am por AlbertoBSD » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #5 en: 25 Junio 2016, 01:51 am »

Sinceramente, no sé cómo el código funciona XD
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #6 en: 25 Junio 2016, 02:00 am »

El codigo orignal viene de que es posible usar el operador igual para copiar una estructura completa de una variable A a una variable B ejemplo:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. struct X {
  6. int A;
  7. int B;
  8. int C;
  9. };
  10.  
  11. int main() {
  12. struct X variable1, variable2;
  13. variable1.A = 1;
  14. variable1.B = 10;
  15. variable1.C = 100;
  16. variable2 = variable1;
  17. printf("%d,%d,%d\n",variable2.A,variable2.B,variable2.C);
  18. return 0;
  19. }

salida:

Código:
1,10,100

La linea responsable por la copia completa del bloque de memoria de la variable1 a la variable2 es:

Código
  1. variable2 = variable1;

Y de ahi el codigo mostrado en los post anteriores.

lo que tu realizaste fue lo mismo pero  solo con el tamaño de un apuntador.

Saludos!
« Última modificación: 25 Junio 2016, 02:07 am por AlbertoBSD » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #7 en: 25 Junio 2016, 02:06 am »

Justo lo acabo de entender y lo iba a publicar... Estoy ciego xD
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: [C] Copiar arreglo de caracteres con Operador Igual
« Respuesta #8 en: 25 Junio 2016, 11:40 am »

Es lo mismo solo qie tratas la estructura como si fuera plana. :xD

Saludos y muy buena también!!
En línea

Un byte a la izquierda.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Convertir cadena en una arreglo de caracteres
Programación Visual Basic
Javilondo 3 10,556 Último mensaje 29 Octubre 2008, 23:01 pm
por Javilondo
modificar arreglo de cadena de caracteres
Programación C/C++
kworld 2 6,266 Último mensaje 31 Mayo 2010, 15:38 pm
por Littlehorse
Duda con puntero a arreglo de caracteres
Programación C/C++
dato000 5 4,810 Último mensaje 30 Noviembre 2012, 21:13 pm
por xiruko
Cantidad de caracteres en un arreglo y cortar una cadena
Programación C/C++
josri 5 4,128 Último mensaje 16 Marzo 2013, 16:34 pm
por naderST
duda con arreglo de caracteres
Programación C/C++
m@o_614 6 3,185 Último mensaje 2 Abril 2014, 19:22 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines