dudas con strcpy

Iniciado por m@o_614, 15 Marzo 2014, 19:31 PM

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

leosansan


La salida que obtienes viene a corroborar el origen de mi duda:

Citar

Lo que queda en str1: da laZga

Copiado, nuevo str2:
Entrada laZga



Y la cadena str2 impresa caracter a caracter:
Entrada laZga
Process returned 0 (0x0)   execution time : 2.366 s
Press any key to continue.


Lo que queda en str1 es justo lo que cabe "oficialmente" en str2 ..... otra vez, y van tres ejemplos.
Fíjate que "da laZga" es justo la cadena str1 sin los 5 caracteres que "cabrían" en str2" de acuerdo a su dimensión. Curioso, ¿no?.

Aclaro mis sospechas:

* En str2 se copia la cadena str1, aunque str2 tenga declarada una dimensión inferior a str1. Eso sucede en los tres ejemplos aquí expuestos, hasta ahora.

* En str1 "queda" lo que "teóricamente" no cabia en str1 por tener menor dimensión.

Como ves tu ejemplo ha venido a ratificar mis sospechas en lugar de negarlo.

Y ¡ojo!, no digo que esto sea una regla general, que de acuerdo a las indicaciones del comportamiento de strcpy vulnera, pero...... los ejemplos parecen empeñarse en dar la razón a mis dudas ... por ahora.

Y repito, sólo es una sospecha de lo que puede ser un comportamiento general y no previsto.


¡¡¡¡ Saluditos! ..... !!!!



amchacon

Cita de: leosansan en 16 Marzo 2014, 00:11 AM
La salida que obtienes viene a corroborar el origen de mi duda:

Lo que queda en str1 es justo lo que cabe "oficialmente" en str2 .....
Vuelve a repasar mi mapa de memoria, ahi explico porque str2 puede almacenar una cadena mayor (comiendole memoria a otras variables ;D).

Cita de: leosansan en 16 Marzo 2014, 00:11 AM* En str1 "queda" lo que "teóricamente" no cabia en str1 por tener menor dimensión.
Podemos usar memoria dinamica, de esa forma nos aseguramos que no ocupan posiciones continuas y no se cumpla mi teoría:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int main ()
{
    int tam = strlen("Entrada larga");
   char* str1 = malloc(tam+1);
   strcpy (str1,"Entrada larga");

   char str2[5] = "abcd";

   strcpy (str2,str1);
   printf ("\n\nLo que queda en str1: %s\n\nCopiado, nuevo str2:\n%s\n\n",str1,str2);
   printf("\n\nY la cadena str2 impresa caracter a caracter:\n ");
   int i;
   for( i=0; str2[i]; i++)
       printf( "%c",str2[i] );
   return 0;
}


Tu regla no se cumple ya que da un error de ejecución en el segundo strcpy. Probablemente porque estemos escribiendo fuera de nuestra memoria reservada.

Cita de: leosansan en 16 Marzo 2014, 00:11 AMFíjate que "da laZga" es justo la cadena str1 sin los 5 caracteres que "cabrían" en str2" de acuerdo a su dimensión. Curioso, ¿no?.
La Z fue introducida después del strcpy, eso quiere decir que esa letra era "común" en las dos cadenas (vuelvo a hacer referencia a mi esquema de la memoria).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#12
Tutti claro ahora, se debía a lo que comentas de posiciones memorias seguidas.

¡¡¡¡ Saluditos! ..... !!!!