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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema: Tamaño de Puntero char
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema: Tamaño de Puntero char  (Leído 6,565 veces)
yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Problema: Tamaño de Puntero char
« en: 15 Agosto 2011, 22:55 pm »

Hola, tengo el siguiente codigo:
 * Un puntero cad a char
 * De tamaño 10
 
Luego de inicializarlo con strcpy, voy agregando cadenas con strcat, pero al ser la variable cad de 10 elementos, ¿no deberia haber un error?


Ademas mi idea es concatenar 'n' caracteres y no solamente '10', es decir no se sabe cuantas cadenas recibira la variable cad, ¿cual seria la declaracion?



Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.  
  7. char *cad;
  8.  
  9. cad=new char[10]();
  10. strcpy(cad,"");
  11.  
  12. strcat(cad,"123");
  13. strcat(cad,"456");
  14. strcat(cad,"789");
  15.  
  16. strcat(cad,"abc"); //<-- Aqui deberia haber un error
  17. strcat(cad,"def"); //<-- Aqui tambien pero el programa corre
  18.  
  19.        strcat(cad,"def"); //<-- Aqui el programa cierra abruptamente
  20.  
  21. printf("%s\n",cad);
  22.  
  23. return 0;
  24.  
  25. }
  26.  

Saludos.


« Última modificación: 15 Agosto 2011, 22:59 pm por yovaninu » En línea

Queta

Desconectado Desconectado

Mensajes: 267



Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #1 en: 15 Agosto 2011, 23:21 pm »

¿Programas en C o en C++? Si programases en C, el método de reserva de memoria no estaría bien dado que el operador new no existe en dicho lenguaje; una buena solución sería utilizar malloc (http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/). En el caso que programases en C++ el método de reserva de memoria tampoco sería válido ya que no utilizas este operador de forma correcta (http://www.cplusplus.com/doc/tutorial/dynamic/).

Como plus, mejor que no utilices ni strcpy ni strcat (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).


En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #2 en: 16 Agosto 2011, 00:12 am »

En C++, bajo VS 2005:

y este código???:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.  
  7. char *cad;
  8.  
  9. cad=new char[10];
  10. strncpy(cad,"",1);
  11.  
  12. strncat(cad,"123",3);
  13. strncat(cad,"456",3);
  14. strncat(cad,"789",3);
  15. strncat(cad,"789",3); // ???
  16. strncat(cad,"789",3); // ???
  17. strncat(cad,"789",3); //<-- Crash!!!
  18.  
  19.  
  20. printf("%s\n",cad);
  21.  
  22. return 0;
  23.  
  24. }
  25.  

Y sigo con la duda de como concatenar 'n' caracteres al primer parametro de strncat, ya que segun la definicion del codigo solo podria juntarle hasta 10 caracteres (claro que parece que recibe 15, luego se cierra el programa).


En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #3 en: 16 Agosto 2011, 00:55 am »

Lo que sucede es que está machacando memoria que no le corresponde , al hacer el new [10] reservas memoria para un char de 10 , y solo le pertenecen 10 posiciones , pero como trabajas con punteros le puedes seguir asignando chars a la cadena , la función
Código
no controla que cad pase del límite , lo único que controla es que el segundo argumento de dicha función tenga la longitud especificada en el tercer argumento , si es mayor no copia los caracteres restantes.
Ejecuta este y veras

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.  
  7. char *cad[2];
  8. char *cad2;
  9.  
  10. cad[0]=new char[10];
  11. cad[1]=new char[10];
  12. //strncpy(cad[0],"",1);
  13.  
  14. strncat(cad[0],"123",3);
  15. strncat(cad[0],"456",3);
  16. strncat(cad[0],"789",3);
  17.  
  18. strncat(cad[0],"789",3); // ???
  19. strncat(cad[0],"789",3); // ???
  20. strncat(cad[0],"789",3); //<-- Crash!!!
  21.  
  22.  
  23. printf("%s %s\n",cad[0] , cad[1]);
  24.  
  25. return 0;
  26.  
  27. }
  28.  
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #4 en: 16 Agosto 2011, 01:28 am »

Me cuesta entender a cerca de las cadenas dinamicas.

Por ejemplo en Basic declaramos esto
Código:
Dim Archivo as String
y 'Archivo' puede ser tan grande o pequeño como querramos.

En todo caso ¿cual es el equivalente en C++? para la variable archivo.

Mi idea inicial era tener una variable 'cad'
Código:
char *cad;
inicializarla con algo como esto:
Código:
cad=new char[];
y en 'cad' poder ir acumulando tantas frases o palabras como yo quisiera. por ejemplo
Código:
strcat(cad,"123");
strcat(cad,"456");
strcat(cad,"789");
strcat(cad,"abc");
strcat(cad,"def");
strcat(cad,"ghi");
strcat(cad,"jkl");
strcat(cad,"mno");
...
para luego de mostrar a 'cad'  con
Código:
printf("%d\n",cad);
me muestre por pantalla:
Código:
12345678abcdefghijklmno




En línea

.:BlackCoder:.


Desconectado Desconectado

Mensajes: 388


Cada dia C++!!


Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #5 en: 16 Agosto 2011, 02:52 am »

Supongo que te conviene leer sobre las variables del tipo "string", lee sobre esta clase antes de simplemente aprender a usarla... Tambien deberias leer sobre los "contenedores".

http://www.cplusplus.com/reference/string/string/

Saludos...

PD: Lee sobre memoria dinamica
En línea

"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja



yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #6 en: 16 Agosto 2011, 04:07 am »

Estoy yá, leendo al respecto, hice algunas pruebas con algunos ejemplos y al parecer funciona. Sin embargo asumo que este nuevo tipo de dato es exclusivo de C++, y cual 'era' o 'es' la forma de hacerlo al puro estilo de C o Ansi C.

Gracias por todo.
En línea

Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: Problema: Tamaño de Puntero char
« Respuesta #7 en: 16 Agosto 2011, 04:22 am »

Luego de inicializarlo con strcpy, voy agregando cadenas con strcat, pero al ser la variable cad de 10 elementos, ¿no deberia haber un error?

te lo explico brevemente, cuando haces uso de malloc/new con valores pequeños la memoria reservada está en el heap (un espacio ya reservado para ser usado de esta forma), por lo que es posible que puedas desbordar el buffer hasta cierto límite (mientras lo que sobreescribas no afecte directamente a otro proceso/función, ya que si lo haces terminará provocando un error [los cuales son los más complicados de encontrar]), tb tienes que tener en cuenta que los tamaños son "redondeados" a tamaños prácticos para el CPU (en el caso del heap son alineados a sizeof(*void) [cuyo tamaño es distinto si es 32 o 64 bits] si mal no recuerdo) y en caso de espacios grandes de memoria a una página (512 bytes aprox), entonces si reservas 10 bytes, el redondeo será de 12 [en 32 bits] (3*sizeof(*void)=3*4=12)

S2
En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Problema: Tamaño de Puntero char
« Respuesta #8 en: 16 Agosto 2011, 14:56 pm »

y cual 'era' o 'es' la forma de hacerlo al puro estilo de C o Ansi C.
???

La respuesta es con realloc http://c.conclase.net/librerias/?ansifun=realloc

Aquí un ejemplo sencillo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_CADENA 10
  5.  
  6. int main()
  7. {
  8.  
  9. char *cad;
  10. char *char_aux ;
  11. int size_entrada = 0 , size_restante = 0;
  12. int aux = 1;
  13.  
  14. //reservamos espacio para 10 char
  15. cad = (char *) malloc(sizeof(char) * MAX_CADENA);
  16. char_aux = (char *) malloc(sizeof(char) * MAX_CADENA);
  17.  
  18. do{
  19. puts("ingresa una cadena(maximo 10 carácteres)");
  20. fgets(char_aux , MAX_CADENA , stdin);
  21. size_entrada = strlen(char_aux);
  22. size_restante = MAX_CADENA - strlen(cad);
  23.  
  24. if(size_restante < size_entrada){
  25. aux++;
  26. cad = (char*) realloc(cad, MAX_CADENA * aux);
  27. }
  28. //pasamos del salto de linea
  29. strncat(cad , char_aux ,size_entrada - 1);
  30. }while (strcmp(char_aux, "\n") != 0 );
  31.  
  32. printf("%s \n",cad);
  33.  
  34. return 0;
  35.  
  36. }

Saludos.
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
martiz de char doble puntero
Programación C/C++
neo_from_cs_matrix 2 6,594 Último mensaje 15 Julio 2011, 00:05 am
por rir3760
duda doble puntero char a matriz de char
Programación C/C++
neo_from_cs_matrix 3 6,251 Último mensaje 5 Septiembre 2011, 03:53 am
por rir3760
[AYUDA] Cómo puedo concatenar un char a un puntero de chars?
Programación C/C++
papita5 8 6,717 Último mensaje 19 Octubre 2011, 20:39 pm
por papita5
Problema con variables puntero
Programación C/C++
oxi12pek 7 3,151 Último mensaje 5 Noviembre 2012, 17:26 pm
por BatchianoISpyxolo
¿Pregunta puntero a char en c++? « 1 2 »
Programación C/C++
Zodiak98 11 6,584 Último mensaje 23 Abril 2013, 17:01 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines