Problema con strcat

Iniciado por DickGumshoe, 21 Enero 2012, 23:58 PM

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

DickGumshoe

Hola.

Estoy realizando un programa que pida por separado tu nombre, día de nacimiento, y mes, y que después lo una en una sola cadena.

Yo tengo esto:


    strcat(aux, nombre);
    strcat(aux, ", nacido el ");
    strcat(aux, dia);
    strcat(aux, "/");
    strcat(aux, mes);
   
    printf("%s\n",aux);


Y, al compilar, si pongo, por ejemplo:

Nombre: Nombre
Día: 09
Mes: 12

Sale como resultado: "Nombre, nacido el /12". Falta el 09...

¿Qué estoy haciendo mal?

Gracias.

Saludos.

rir3760

Habra que revisar el fragmento donde pides los datos, ya que strcat requiere dos cadenas. Supongo el tipo de "nombre", "dia" y "mes" es "array de caracteres", ¿Correcto?

Una forma mas corta es mediante sprintf o, si solo se imprime en la salida estándar, printf.

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

DickGumshoe

Lo acabo de hacer ahora con sprintf, y tampoco. Me sale lo mismo...

Este es el código entero:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
   
    char nombre[40],aux[60];
    char dia[2],mes[2];
   
    printf("Introduce tu nombre");
    gets(nombre);
   
    printf("Introduce el dia en que naciste");
    gets(dia);
   
    printf("Introduce el mes en que naciste");
    gets(mes);
    sprintf(aux,"%s, nacido el %s/%s",nombre,dia,mes);
   
   
   
    printf("%s\n",aux);
   
    system("pause");
    return 0;
}


Gracias.

x64core

pues a mi con printf si me funciono, que compilador usas?
y para strcat incializa las cadenas:    
char nombre[40]={0};
   char aux[60]={0};
   char dia[2]={0};
    char mes[2]={0};

rir3760

El programa tiene errores básicos, si no tienes un curso o libro de calidad te aconsejo que consigas uno. Puedes revisar las recomendaciones utilizando el motor de búsqueda de los foros.

En C las cadenas son secuencias de caracteres seguidas de un '\0' para indicar el final de esta. Si declaras un array de dos elementos tipo char:
char dia[2],mes[2];
Tanto "dia" como "mes" solo pueden almacenar cadenas de un solo carácter ya que el restante se debe reservar para el '\0'. Eso se pasa por el arco del triunfo debido a que utilizas la función "gets". Por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|

Para solucionarlo debes cambiar el numero de elementos de esos dos arrays a tres y utilizar la función "fgets" (o una propia) para leer cada linea de la entrada estándar.

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

DickGumshoe

#5
Ah, ¡muchísimas gracias! Se me había olvidado que había también un caracter nulo...

Por cierto, en los sitios que he estado visitando para ver la función fgets; por lo que veo, hablan de ficheros (todavía no he llegado a esa parte en el manual que estoy siguiendo). Y no sé si será por haber usado gets; pero ahora el resultado del programa da bien, exceptuando que antes de mi nombre salen cuatro caracteres raros...

Gracias.

Saludos.

EDITO: Con sprintf, lo que acabo de decir, me lo ha hecho bien. Sin embargo, con strcat no...

rir3760

Cita de: DickGumshoe en 22 Enero 2012, 11:15 AMEDITO: Con sprintf, lo que acabo de decir, me lo ha hecho bien. Sin embargo, con strcat no...
Si deseas ayuda primero debes publicar el código fuente (si no lo haces no hay forma de solucionar el problema).

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

DickGumshoe

#7
Ah, vale, se me había olvidado ponerlo.

Con sprintf, que queda bien el resultado, tengo esto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
   
   char nombre[40],aux[60];
   char dia[3],mes[3];
   
   printf("Introduce tu nombre");
   gets(nombre);
   
   printf("Introduce el dia en que naciste");
   gets(dia);
   
   printf("Introduce el mes en que naciste");
   gets(mes);
   sprintf(aux,"%s, nacido el %s/%s",nombre,dia,mes);
   
   
   
   printf("%s\n",aux);
   
   system("pause");
   return 0;
}


Pero, con strcat, me salen caracteres extraños antes del nombre:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
   
   char nombre[40],aux[60];
   char dia[3],mes[3];
   
   printf("Introduce tu nombre");
   gets(nombre);
   
   printf("Introduce el dia en que naciste");
   gets(dia);
   
   printf("Introduce el mes en que naciste");
   gets(mes);
   
   strcat(aux, nombre);
   strcat(aux, ", nacido el ");
   strcat(aux, dia);
   strcat(aux, "/");
   strcat(aux, mes);
   
   printf("%s\n",aux);
   
   system("pause");
   return 0;
}


EDITO: Estaba intentándolo, y al declarar la variable aux, he puesto esto:

aux[60]={};

Y ahora me sale bien. ¿Será porque no le di antes un valor a aux?

Gracias.

Saludos.


satu

Hola

Cita de: DickGumshoe en 22 Enero 2012, 17:46 PM

EDITO: Estaba intentándolo, y al declarar la variable aux, he puesto esto:

aux[60]={};

Y ahora me sale bien. ¿Será porque no le di antes un valor a aux?


El problema está aquí:

strcat(aux, nombre);


Ya que como bien sabes strcat() se utiliza para concatenar cadenas, entonces lo que hace es añadir detrás del carácter '\0' de aux lo que hay en nombre, pero al no estar inicializado aux, puede que no tenga el carácter '\0', por eso falla.

Una solución sería inicializar aux como has hecho o en lugar de concatenar, copiar para darle el primer valor:

strcpy(aux, nombre);
strcat(aux, ", nacido el ");
strcat(aux, dia);
strcat(aux, "/");
strcat(aux, mes);


Saludos
Breakbeat como forma de vida

Sagrini

No me he molestado en leer el resto de mensajes, pero te dejo la solución tal cual:
DIA lo declaras como entero, y necesitas pasarle a strcat una cadena. Lee sobre las funciones atoi () e itoa().