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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  strcpy en puntero matriz
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: strcpy en puntero matriz  (Leído 4,370 veces)
psycho248

Desconectado Desconectado

Mensajes: 11


Ver Perfil
strcpy en puntero matriz
« en: 22 Junio 2014, 23:04 pm »

Hola. Ayuda por favor  :huh:
Estoy tratando de copiar una cadena de un puntero matriz a otro puntero matriz,
Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. const char *cad[5]={"uno","dos","tres","cuatro","cinco"};
  7. char *cad2[3];
  8.  
  9. printf("%s\n",cad[3]);
  10.  
  11. strcpy(cad2[0],cad[3]);
  12.  
  13. printf("\n%s\n",cad2[0]);
  14.  

Pero solo me deja guardarlo a partir del segundo lugar de la cadena matriz, ya que si lo quiero guardar en el primer lugar me marca "core generado"

Forzosamente tengo que dejar libre el subíndice o ??????


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #1 en: 23 Junio 2014, 08:23 am »

Código
  1. char *cad[3];

Con esa declaración estás declarando un vector con 3 punteros de tipo char... pero claro, cada uno de esos punteros está apuntando a cualquier sitio menos a zonas de memoria seguras.

Tienes dos opciones... o inicializas esos punteros con malloc para hacer la reserva de memoria dinámica o creas un array bidimiensional y te olvidas de reservas dinámicas:

* Con malloc
Código
  1. char *cad2[ 3 ];
  2. cad2[ 0 ] = malloc( 10, sizeof( char ) );
  3. cad2[ 1 ] = malloc( );
  4. cad2[ 2 ] = malloc( );

*Sin malloc
Código
  1. char *cad2[ 3][10];


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #2 en: 23 Junio 2014, 16:24 pm »



* Con malloc
Código
  1. char *cad2[ 3 ];
  2. cad2[ 0 ] = malloc( 10, sizeof( char ) );
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

¿No sería?:

Código
  1. cad2[ 0 ] = malloc( 10 );

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


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #3 en: 23 Junio 2014, 16:29 pm »

¿No sería?:

Código
  1. cad2[ 0 ] = malloc( 10 );

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



sip es asi leosansan... en dado caso por seguridad...
Código
  1. malloc( 10 * sizeof( char ) );
En línea

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.
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #4 en: 23 Junio 2014, 16:43 pm »

sip es asi leosansan... en dado caso por seguridad...
Código
  1. malloc( 10 * sizeof( char ) );

¿No sería?:

Código
  1. cad2[ 0 ] = ( char* ) malloc( 10 );

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


En línea

psycho248

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #5 en: 23 Junio 2014, 17:40 pm »

HOLA!!! Sus ejemplos me han dado buenas ideas. Gracias.

Pero en caso de que mi codigo se encuentre en una función es necesaria usar el "free(cad2)"??
y en que momento usarlo??  :-[

Por otro lado traté de reescribir el código de esta manera:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. const char *cad[5]={"uno","dos","tres","cuatro","cinco"};
  6. char cadena[3];
  7. char *ptrcad;
  8. int i;
  9.  
  10. for(i=0; i<3; i++)
  11. {
  12.  *ptrcad = *cad[i];
  13.  cadena[i] = *ptrcad;
  14.  printf("%s--\n",ptrcad);
  15.  printf("%s\n",cadena[i]);
  16. }
  17.  
  18. return 0;
  19. }
  20.  

Pero al imprimir ptrcad solo me imprime "basura" Y cadena  lo convierte a int.
Es el mismo caso de memoria dispersa?????????'
« Última modificación: 23 Junio 2014, 17:57 pm por psycho248 » En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #6 en: 23 Junio 2014, 18:34 pm »

¿No sería?:

Código
  1. cad2[ 0 ] = ( char* ) malloc( 10 );

 La forma que propuso el compañero engel lex seria la mas apropiada. El cast en el nuevo estandar de C es innecesario ya que malloc retorna un puntero generico el cual puede ser asignado a cualquier tipo de puntero excepto los punteros de función, sin la necesidad de un molde.

 Con respecto a sizeof por cuestiones de seguridad creo que es importante calcular el tamaño exacto de un tipo de dato en particular ya que segun las implementaciones este puede variar

Saludos  
« Última modificación: 23 Junio 2014, 22:54 pm por Blaster » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #7 en: 23 Junio 2014, 19:24 pm »

La forma que propuso el compañero engel lex seria la mas apropiada. El cast en el nuevo estandar de C es innecesario ya que malloc retorna un puntero generico el cual puede ser asignado a cualquier tipo de puntero excepto los punteros de función, sin la necesidad de un molde.
 .................................................

En C, no así, creo, en C++.

Pero estoy de acuerdo con lo que había propuesto engel lex, sólo que me salió más breve, sorry:

Código
  1. cad2[0] = malloc(10) = malloc(10*1) = malloc(10*sizeof (char))

...............................................................
 Con respecto a sizeof por cuestiones de seguridad creo que es importante calcular el tamaño exacto de un tipo de dato en particular ya que segun las implementaciones este puede variar
................................

Habalmos, yo al menos, de char, no de int ni float. ¿Cambia el tamaño de char en distintas implementaciones, o no es siempre 1?. Me acabas de crear una duda. :o

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


En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #8 en: 23 Junio 2014, 20:19 pm »

En C, no así, creo, en C++.

Quien esta hablando de C++, segun veo el lenguaje utilizado por quien creo post es C.

Habalmos, yo al menos, de char, no de int ni float. ¿Cambia el tamaño de char en distintas implementaciones, o no es siempre 1?. Me acabas de crear una duda

Efectivamente el tamaño de del tipo char es siempre uno, pero yo en el comentario de arriba estaba generalizando, ya que  considero que es buena costumbre utilizar el operador sizeof para evitar posibles errores inesperados
« Última modificación: 23 Junio 2014, 22:59 pm por Blaster » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: strcpy en puntero matriz
« Respuesta #9 en: 24 Junio 2014, 09:22 am »

HOLA!!! Sus ejemplos me han dado buenas ideas. Gracias.

Pero en caso de que mi codigo se encuentre en una función es necesaria usar el "free(cad2)"??
y en que momento usarlo??  :-[

Por otro lado traté de reescribir el código de esta manera:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. const char *cad[5]={"uno","dos","tres","cuatro","cinco"};
  6. char cadena[3];
  7. char *ptrcad;
  8. int i;
  9.  
  10. for(i=0; i<3; i++)
  11. {
  12.  *ptrcad = *cad[i];
  13.  cadena[i] = *ptrcad;
  14.  printf("%s--\n",ptrcad);
  15.  printf("%s\n",cadena[i]);
  16. }
  17.  
  18. return 0;
  19. }
  20.  

Pero al imprimir ptrcad solo me imprime "basura" Y cadena  lo convierte a int.
Es el mismo caso de memoria dispersa?????????'

Código
  1.  *ptrcad = *cad[i];
  2.  cadena[i] = *ptrcad;

ptrcad es un puntero de tipo char* y cad también... no hace falta usar ese asterisco... y en la asignación siguiente tampoco.

los usos de los punteros son los siguientes:

Código
  1. char* ptr1;
  2. char* ptr2[2] = { "Hola", "Adios" };
  3. char c;
  4. int m;
  5.  
  6. // inicializacion
  7. // ...
  8.  
  9. ptr1 = ptr2[ 0 ]; // ptr1 apunta a "Hola"
  10. c = *ptr2[ 1 ]; // c almacenará 'A'
  11.  
  12. memoria = &ptr1; // m almacena la posición de memoria donde se encuentra ptr1
  13. memoria = (int)ptr1; // m almacena la posición de memoria apuntada por ptr1
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines