Implementando strcat usando punteros

Al hacer algunos progtwigs en cadenas, me he encontrado con este pequeño problema. La pregunta que me hicieron fue esta: escriba una versión de puntero de la función strcat (s, t) que copia la cadena t al final de s. Escribí el progtwig así:

#include void strcat(char *s, char *t); int main() { char *s1, *s2; printf("enter the first string\n"); scanf("%s",s1); printf("Enter the second string\n"); scanf("%s",s2); strcat(s1,s2); printf("Strings concatenated\n"); printf("%s",s1); return 0; } void strcat(char *s, char *t) { while(*s++) ; while(*s++ = *t++) ; } 

Sé que he hecho algo (o muchas cosas) terriblemente mal. Porque siempre que bash ejecutar este código, me da una falla de segmentación. Me gusta esto-

Ingrese la primera cadena

Hola

Introduzca la segunda cadena

Fallo de segmentación (núcleo volcado)

Sería de gran ayuda si alguien me señala los defectos / fallas de mi implementación. Gracias por adelantado.

Muchas gracias chicos, por tan rápidas respuestas. Pero parece que ese no fue el único problema. Después de escribir el progtwig como este-

 #include void strcat(char *s, char *t); int main() { char s1[20], s2[20]; printf("enter the first string\n"); scanf("%s",s1); printf("Enter the second string\n"); scanf("%s",s2); strcat(s1,s2); printf("Strings concatenated\n"); printf("%s",s1); return 0; } void strcat(char *s, char *t) { while(*s++) ; while(*s++ = *t++) ; } 

Funciona así.

Ingrese la primera cadena

Hola

Introduzca la segunda cadena

Ahí

Hola

Sólo imprime la primera cadena que he introducido. Ahora creo que también he cometido algún error en esa función strcat.

1) En main() , debe asignar memoria para los punteros s1 y s2

 char *s1=malloc(100*sizeof(char)), *s2=malloc(100*sizeof(char)); scanf("%99s",s1); //the "%99s" allow to avoid buffer overflow 

Y si usa gcc y su gcc> 2.7, entonces puede usar “% ms” en el scanf() de esta manera:

 scanf("%ms",&s1); 

con el "%ms" , el scanf() asignará memoria para el puntero s1

2) y tienes que añadir s-- en

 while(*s++) ; s--; // add s-- here while(*s++ = *t++) ; 

porque el puntero s está apuntando en el siguiente elemento del elemento '\0' . el puntero s debe apuntarse en el elemento '\0' antes de comenzar a copiar la segunda cadena

No asigna memoria para s1 , s1 (o se inicializa con una matriz), el valor de ambos s1 , s1 es basura.

 char *s1, *s2; printf("enter the first string\n"); scanf("%s",s1); 

Esto provoca un comportamiento indefinido.

Sugerencia de uso, ya sea:

 #define SIZE 1024 char s1[SIZE], s2[SIZE]; 

o asignar memoria dinámicamente usando las funciones calloc () / maloc ():

 char *s1, *s2; s1 = malloc(SIZE); s2 = malloc(SIZE); 

y últimamente memoria libre () explícitamente cuando el trabajo realizado con s1 , s2 .

Además, en lugar de unsafe scanf() use la fgets() para evitar un error de desbordamiento del búfer. Leer ¿ Leer una línea usando scanf() no es bueno?