Concatenar cadena con strcpy

Aqui esta mi codigo

#include  #include  #include  int main() { char f[] = "First"; char s[] = "Second"; char *tmp = malloc(strlen(f) + strlen(s) + 2); strcpy(tmp, f); strcpy(tmp, s); printf("%s", tmp); free(tmp); return 0; } 

Estoy tratando de concatenar f y s. El problema es que tmp contiene solo “Segundo” como una matriz. Lo que echo de menos aqui

Si insistes en usar strcpy , tu código debería modificarse ligeramente:

 int main() { const char *f = "First"; const char *s = "Second"; char *tmp = malloc(strlen(f) + strlen(s) + 1); strcpy(tmp, f); strcpy(tmp+strlen(f), s); printf("%s", tmp); free(tmp); return 0; } 

Debería considerar el uso de strncpy lugar de strcpy por razones de seguridad. Además, strcat es una función más convencional para concatenar la cadena C

EDITAR Aquí hay un ejemplo del uso de strncpy lugar de strcpy

 #define MAX 1024 int main() { const char *f = "First"; const char *s = "Second"; size_t len_f = min(strlen(f), MAX); size_t len_s = min(strlen(s), MAX); size_t len_total = len_f + len_s; char *tmp = malloc(len_total + 1); strncpy(tmp, f, len_f); strncpy(tmp+len_f, s, len_s); tmp[len_total] = '\0'; printf("%s", tmp); free(tmp); return 0; } 

strcpy copia la cadena al principio del destino, en su lugar, desea strcat .

La segunda strcpy sobrescribe la anterior. Ambos copian su contenido al puntero tmp (al comienzo de él). Debe utilizar tmp+strlen(f) .

O incluso mejor usar strcat .

Y aún mejor utilice métodos más seguros como: strncpy , strncat , etc.

Es posible que desee utilizar strcat lugar de su segunda llamada de strcpy , como esto:

 strcpy(tmp, f); strcat(tmp, s); 

Tenga en cuenta también que la asignación de strlen(f) + strlen(s) + 1 bytes para tmp es suficiente, no es necesario asignar strlen(f) + strlen(s) + 2 bytes. Después de la concatenación, solo obtendrá una cadena, por lo que solo se requiere un carácter nulo.

utilizando strcat () en su lugar, lo que significa que agregar una cadena de caracteres a la MSDN doc.strcpy () simplemente significa copiar una cadena. Si no desea utilizar strcat (), debe señalar la posición utilizando strncpy () o strcpy_s (). Por favor, consulte el documento.

El problema es que copia la segunda cadena en lugar de la primera (el primer parámetro de strcpy() es donde se copia la cadena) y esto sobrescribe la primera cadena. Aquí hay una idea de lo que necesitas:

 size_t firstLen = strlen( f ); size_t secondLen = strlen( s ); char *tmp = malloc(firstLen + secondLen + 1); strcpy(tmp, f); strcpy(tmp + firstLen, s); 

Esto se puede lograr usando strcat() , aunque eso llevaría a un escaneo adicional a lo largo de la cadena copiada.

Aquí está la forma segura idiomática correcta de hacer lo que quieres:

 size_t l = strlen(f); char *tmp = malloc(l + strlen(s) + 1); strcpy(tmp, f); strcpy(tmp+l, s); 

o:

 size_t l = strlen(f) + strlen(s) + 1; char *tmp = malloc(l); snprintf(tmp, l, "%s%s", f, s); 

Tiendo a preferir lo último, a menos que esté escribiendo código de sistemas incrustados en el que quiera evitar la dependencia de printf .

Finalmente, tenga en cuenta que debería probar malloc busca de fallos, y que es inútil y perjudicial asignar memoria y copiar las cadenas si todo lo que quiere hacer es imprimirlas; podría hacer lo siguiente:

 printf("%s%s", f, s);