Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 21 Diciembre 2013, 03:13 am



Título: uso de strcat
Publicado por: m@o_614 en 21 Diciembre 2013, 03:13 am
Saludos, tengo una duda sobre el uso de la función strcat.

si yo tengo una cadena inicializada en NULL, *cadena = NULL, y con un ciclo while quiero ir agregadole caracter por caracter podria hacer esto con el strcat que me vaya concatenando al final de la cadena caracter por caracter??

algo como asi:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    int i = 0;
  8.    char *cadena = NULL,c[5],car;
  9.    while(i < 5)
  10.    {
  11.        printf("Dame car\n");
  12.        fgets(c,5,stdin);
  13.        sscanf(c,"%c",&car);
  14.        strcat(cadena,car);
  15.        i++;
  16.    }
  17.    return 0;
  18. }

es que el codigo no funciona y creo que es por el strcat

gracias


Título: Re: uso de strcat
Publicado por: naderST en 21 Diciembre 2013, 07:15 am
El primer parámetro de strcat debe ser una cadena de C con espacio suficiente para almacenar la cadena que le vas a concatenar.

http://www.cplusplus.com/reference/cstring/strcat/ (http://www.cplusplus.com/reference/cstring/strcat/)


Título: Re: uso de strcat
Publicado por: m@o_614 en 21 Diciembre 2013, 20:27 pm
ya vi que mi error era en que no le habia asignado memoria a la cadena, pero ahora por ejemplo si le ingreso las letras a, b, c, d, e. cuando le pido que imprima ya la cadena completa me imprime con basura #Wqabcde,

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    int i = 0;
  8.    char *cadena = NULL,buffer[5],car;
  9.    cadena = malloc(5);
  10.    while(i < 5)
  11.    {
  12.        printf("Dame car\n");
  13.        fgets(buffer,5,stdin);
  14.        sscanf(buffer,"%c",&car);
  15.        sprintf(buffer,"%c",car);
  16.        strcat(cadena,buffer);
  17.        i++;
  18.    }
  19.    printf("\n%s",cadena);
  20.    return 0;
  21. }



Título: Re: uso de strcat
Publicado por: rir3760 en 22 Diciembre 2013, 01:46 am
vi que mi error era en que no le habia asignado memoria a la cadena, pero ahora por ejemplo si le ingreso las letras a, b, c, d, e. cuando le pido que imprima ya la cadena completa me imprime con basura #Wqabcde
1) Cuando reservas un bloque de memoria con malloc su contenido es no definido o basura.

2) strcat concatena las cadenas agregando la segunda al final de la primera. Para ello debe primero encontrar el carácter '\0' que indica el final de esta.

3) Si piensas leer cinco caracteres y almacenarlos como una cadena debes reservar un byte adicional para almacenar ahí el terminador de cadena '\0'.

En base a ello ya puedes solucionar el problema en tu programa.

Un saludo


Título: Re: uso de strcat
Publicado por: m@o_614 en 22 Diciembre 2013, 16:18 pm
muchas rir3760 ya le cambie el malloc por el calloc para que se inicialice sin basura, una última duda, como en el codigo primero le pido el valor de car y despues le hago un "cast" con sprintf para que sea una cadena, no seria mejor si simplemente  quitar el sscanf y el sprintf, me quedo con el fgets y despues se lo concateno a con strcat, porque como tiene que ser tipo cadena creo que el sprintf y el sscanf están de más

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    int i = 0;
  8.    char *cadena = NULL,buffer[5];
  9.    cadena = calloc(5+1);
  10.    while(i < 5)
  11.    {
  12.        printf("Dame car\n");
  13.        fgets(buffer,5,stdin);
  14.        strcat(cadena,buffer);
  15.        i++;
  16.    }
  17.    printf("%s",cadena);
  18.    return 0;
  19. }

gracias


Título: Re: uso de strcat
Publicado por: rir3760 en 22 Diciembre 2013, 22:07 pm
una última duda, como en el codigo primero le pido el valor de car y despues le hago un "cast" con sprintf para que sea una cadena, no seria mejor si simplemente  quitar el sscanf y el sprintf, me quedo con el fgets y despues se lo concateno a con strcat
Ya que el programa solo colecta caracteres para formar una cadena basta con scanf:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int i;
  7.   char *p;
  8.  
  9.   p = malloc(6);
  10.   for (i = 0; i < 5 && scanf(" %c", p + i) == 1; i++)
  11.      ;
  12.   p[i] = '\0';
  13.  
  14.   printf("%s\n", p);
  15.  
  16.   return EXIT_SUCCESS;
  17. }

Un saludo