[AYUDA] Cómo puedo concatenar un char a un puntero de chars?

Iniciado por papita5, 15 Octubre 2011, 05:10 AM

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

papita5

Wenas

Estoy haciendo un programa el cual recibe caracteres por la funcion getch() y los va concatenando a un puntero de chars. La idea seria algo asi:

Código (cpp) [Seleccionar]
char *cad = "";
int tecla; // necesito que sea int para comparar el valor de la tecla (ej: si apreta enter (0x13) termina el bucle)
while(true)
{
 tecla = getchar();
 cad[strlen(cad)] = (char)tecla;
 cad[strlen(cad)+1] = '\0';
...
}


La cadena a la que voy concatenando los caracteres necesito que sea un puntero para no fijarle un tamaño.

Cómo podría hacerlo? ya busque por todos lados pero no encontre nada que me pueda servir :s

nota: ya probe strcat(cad, (char*)tecla) pero me tira error en tiempo de ejecucion: violacion de memoria.

Saludos

do-while

¡Buenas!

Investiga sobre las funciones malloc, realloc y free (se encuentran en stdio.h). Son las que estas buscando.

Si te surgen dudas sobre su manejo, ya lo sabes, consultanos.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

papita5

Intente usarlas pero me tiran errores de memoria o me ponen basura en el puntero.
Se que se usan en conjunto y tienen un orden pero no se como van.
Me vendría bien un simple ejemplo de uso de estas funciones, en las guias las usan individualmente y no enseñan bien.
Saludos

do-while

#3
¡buenas!

Todas malloc y realloc devuelven un puntero a void (void*), por lo tanto tendras que aplicarles un cast al tipo que quieras:

tu_tipo *un_puntero = NULL;

un_puntero = (tu_tipo*) malloc(sizeof(tu_tipo) * numero_de_componentes_que_quieras);


y lo mismo con realloc:

tu_tipo *un_puntero = NULL;

un_puntero = (tu_tipo*) realloc(un_puntero, sizeof(tu_tipo) * numero_de_componentes_que_quieras);


Recuerda que es mas que reconmendable inicializar los punteros a NULL. Si un_puntero es NULL, realloc actua como malloc, y si el segundo parametro de realloc es cero, actuara como free. Si el puntero que recibe realloc no ha sido asignado de forma dinamica (malloc o calloc) obtendras errores por violaciones de acceso, lo mismo que pasara con free.

Despues de intentar asignar memoria, comprueba siempre si se ha podido realizar la operacion (si el puntero devuelto es NULL o no). Si utilizas realloc, utiliza un puntero auxiliar para comprobar si se ha podido reasignar la memoria. Si lo haces sobre el mismo puntero que contiene los datos y se le asigna un valor a NULL por no poder haber conseguido redimensionar el vector, habras cometido dos errores, perder los datos en alguna parte de la memoria y no poder liberarla, dejandola de forma permanente ocupando un espacio de memoria. Por esto ultimo, debes acordarte siempre de liberar la memoria que asignes de forma dinamica.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Solo dos aclaraciones.

Los prototipos de las funciones malloc, calloc, realloc y free se encuentran en el encabezado <stdlib.h>.

Sobre la conversión explicita del "void *" que retornan esas funciones es obligatoria en C++ pero no se recomienda en C (ya que ella es automática).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

do-while

Cita de: rir3760 en 15 Octubre 2011, 19:05 PM
Los prototipos de las funciones malloc, calloc, realloc y free se encuentran en el encabezado <stdlib.h>.

Cierto, no me habia dado cuenta de que le habia dicho que estaban en stdio  :P

Cita de: rir3760 en 15 Octubre 2011, 19:05 PM
Sobre la conversión explicita del "void *" que retornan esas funciones es obligatoria en C++ pero no se recomienda en C (ya que ella es automática)

Llevo mas de diez años programando en C, y nunca me ha dejado asignar directamente el puntero devuelto al asignar memoria dinamicamente. Siempre he utilizado MinGW (gcc, vamos), no se si otros compiladores permiten la asignacion directa o no, no los he usado y por lo tanto no lo puedo saber. Al reves de lo que dices, en C++ no hace falta realizar el cast, ya que el propio new devuelve un puntero correcto (o deberia hacerlo), del tipo de la clase (o vector de clases) que estes creando.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: do-while en 16 Octubre 2011, 20:13 PMLlevo mas de diez años programando en C, y nunca me ha dejado asignar directamente el puntero devuelto al asignar memoria dinamicamente. Siempre he utilizado MinGW (gcc, vamos)
Es extraño, habría que revisar la linea de comando que utilizas. En el caso de gcc/cygwin para compilar en el modo mas estricto posible se llama a este con:
gcc -c -ansi -pedantic -Wall -O main.c
Y al utilizarlo asi una llamada a malloc como esta:
num = malloc(10 * sizeof *num);
Debe compilar sin problemas (para el caso según el estándar de C debe pasar correctamente con cualquier compilador).

Cita de: do-while en 16 Octubre 2011, 20:13 PMAl reves de lo que dices, en C++ no hace falta realizar el cast, ya que el propio new devuelve un puntero correcto (o deberia hacerlo), del tipo de la clase (o vector de clases) que estes creando.
Me refería a las llamadas a malloc y compañía. En ese lenguaje la misma llamada:
num = malloc(10 * sizeof *num);
Debe generar un mensaje indicando que falta la conversión, la forma correcta es (si "num" es de tipo "int *"):
num = (int *) malloc(10 * sizeof *num);
Pero como bien comentas es mejor utilizar el par new/delete para reservas de memoria en C++ ya que así se garantiza (si aplica) la ejecución de los constructores/destructores.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

do-while

¡Buenas!

Me trago mis palabras sin aliñar.  :silbar:

Acabo de probar la asignacion sin cast del puntero devuelto por malloc (utilizando el compilador de C) y no ha protestado ni me ha insultado ni nada.  :xD

Por lo que se ve en algun momento he debido de tener algun trauma con la conversion, seguramente porque cuando empece no me fijaba si creaba ficheros .c o .cpp, y lo deberia de hacer en .cpp por lo que me saltaba g++ en lugar de gcc... asi que desde entonces tengo la costumbre de hacer siempre el cast.

Siento haber mareado la perdiz de esta forma.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

papita5