Autor
|
Tema: [AYUDA] Cómo puedo concatenar un char a un puntero de chars? (Leído 6,804 veces)
|
papita5
Desconectado
Mensajes: 29
|
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: 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
|
|
« Última modificación: 15 Octubre 2011, 05:14 am por newbie_hacker »
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
papita5
Desconectado
Mensajes: 29
|
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
|
|
|
En línea
|
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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!
|
|
« Última modificación: 15 Octubre 2011, 07:39 am por do-while »
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
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 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!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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) 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). 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. 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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas! Me trago mis palabras sin aliñar. 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. 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!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
papita5
Desconectado
Mensajes: 29
|
Solucionado, muchas gracias por la ayuda
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
martiz de char doble puntero
Programación C/C++
|
neo_from_cs_matrix
|
2
|
6,645
|
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,319
|
5 Septiembre 2011, 03:53 am
por rir3760
|
|
|
Ayuda! Concatenar carácteres en C
Programación C/C++
|
ARCAME
|
1
|
2,460
|
2 Diciembre 2012, 20:50 pm
por durasno
|
|
|
Ayuda convirtiendo puntero void a unsigned char y obtener su valor
Programación C/C++
|
harry_the_blogger
|
4
|
3,448
|
5 Octubre 2014, 21:40 pm
por harry_the_blogger
|
|
|
Ayuda para guardar como char o como int
Programación C/C++
|
ciquee
|
5
|
3,198
|
11 Marzo 2019, 18:24 pm
por ciquee
|
|