¿Cómo concateno dos cadenas en C?

¿Cómo agrego dos cadenas?

Intenté name = "derp" + "herp"; , pero tengo un error:

La expresión debe tener un tipo integral o enum

C no tiene el soporte para cadenas que tienen otros lenguajes. Una cadena en C es solo un puntero a una matriz de caracteres que finaliza con el primer carácter nulo. No hay operador de concatenación de cadenas en C.

Use strcat para concatenar dos cadenas. Puede usar la siguiente función para hacerlo:

 #include  #include  char* concat(const char *s1, const char *s2) { char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator // in real code you would check for errors in malloc here strcpy(result, s1); strcat(result, s2); return result; } 

Esta no es la forma más rápida de hacerlo, pero no debería preocuparse por eso ahora. Tenga en cuenta que la función devuelve un bloque de memoria asignada en montón a la persona que llama y transfiere la propiedad de esa memoria. Es responsabilidad de quien llama free la memoria cuando ya no sea necesaria.

Llame a la función de esta manera:

 char* s = concat("derp", "herp"); // do things with s free(s); // deallocate the string 

Si le molestaba el rendimiento, querría evitar examinar repetidamente los búferes de entrada buscando el terminador nulo.

 char* concat(const char *s1, const char *s2) { const size_t len1 = strlen(s1); const size_t len2 = strlen(s2); char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator // in real code you would check for errors in malloc here memcpy(result, s1, len1); memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator return result; } 

Si planeas hacer mucho trabajo con cadenas, es mejor que utilices un idioma diferente que tenga soporte de primera clase para cadenas.

 #include  int main(){ char name[] = "derp" "herp"; printf("\"%s\"\n", name);//"derpherp" return 0; } 

David Heffernan explicó el problema en su respuesta y escribí el código mejorado. Vea abajo.

Una función genérica

Podemos escribir una función variadica útil para concatenar cualquier cantidad de cadenas:

 #include  // calloc #include  // va_* #include  // strlen, strcpy char* concat(int count, ...) { va_list ap; int i; // Find required length to store merged string int len = 1; // room for NULL va_start(ap, count); for(i=0 ; i 

Uso

 #include  // printf void println(char *line) { printf("%s\n", line); } int main(int argc, char* argv[]) { char *str; str = concat(0); println(str); free(str); str = concat(1,"a"); println(str); free(str); str = concat(2,"a","b"); println(str); free(str); str = concat(3,"a","b","c"); println(str); free(str); return 0; } 

Salida:

  // Empty line a ab abc 

Limpiar

Tenga en cuenta que debe liberar la memoria asignada cuando no sea necesaria para evitar pérdidas de memoria:

 char *str = concat(2,"a","b"); println(str); free(str); 

Deberías usar strcat , o mejor, strncat . Google it (la palabra clave es “concatenar”).

No puede agregar literales de cadena como el de C. Debe crear un búfer de tamaño de cadena literal uno + cadena literal dos + un byte para carácter de terminación nula y copiar los literales correspondientes en ese búfer y también asegurarse de que sea nulo terminado . O puede usar las funciones de la biblioteca como strcat .

Asumiré que lo necesitas para cosas únicas. Asumiré que eres un desarrollador de PC.

Usa la stack, Luke. Úselo en todas partes. No use malloc / free para pequeñas asignaciones, nunca .

 #include  #include  #define STR_SIZE 10000 int main() { char s1[] = "oppa"; char s2[] = "gangnam"; char s3[] = "style"; { char result[STR_SIZE] = {0}; snprintf(result, sizeof(result), "%s %s %s", s1, s2, s3); printf("%s\n", result); } } 

Si 10 KB por cadena no son suficientes, agregue un cero al tamaño y no se moleste, – ellos liberarán su memoria de stack al final de los ámbitos de todos modos.

Sin la extensión de GNU:

 #include  #include  #include  int main(void) { const char str1[] = "First"; const char str2[] = "Second"; char *res; res = malloc(strlen(str1) + strlen(str2) + 1); if (!res) { fprintf(stderr, "malloc() failed: insufficient memory!\n"); return EXIT_FAILURE; } strcpy(res, str1); strcat(res, str2); printf("Result: '%s'\n", res); free(res); return EXIT_SUCCESS; } 

Alternativamente con la extensión de GNU:

 #define _GNU_SOURCE #include  #include  #include  int main(void) { const char str1[] = "First"; const char str2[] = "Second"; char *res; if (-1 == asprintf(&res, "%s%s", str1, str2)) { fprintf(stderr, "asprintf() failed: insufficient memory!\n"); return EXIT_FAILURE; } printf("Result: '%s'\n", res); free(res); return EXIT_SUCCESS; } 

Vea malloc , free y asprintf para más detalles.

 #include  #include  int main() { int a,l; char str[50],str1[50],str3[100]; printf("\nEnter a string: "); scanf("%s",str); str3[0]='\0'; printf("\nEnter the string which you want to concat with string one: "); scanf("%s",str1); strcat(str3,str); strcat(str3,str1); printf("\nThe string is %s\n",str3); } 

Cadenas de concatenados

La concatenación de dos cadenas en C se puede hacer al menos de 3 maneras:

1) Copiando la cadena 2 al final de la cadena 1

 #include  #include  #define MAX 100 int main() { char str1[MAX],str2[MAX]; int i,j=0; printf("Input string 1: "); gets(str1); printf("\nInput string 2: "); gets(str2); for(i=strlen(str1);str2[j]!='\0';i++) //Copying string 2 to the end of string 1 { str1[i]=str2[j]; j++; } str1[i]='\0'; printf("\nConcatenated string: "); puts(str1); return 0; } 

2) Copiando la secuencia 1 y la cadena 2 a la cadena 3

 #include  #include  #define MAX 100 int main() { char str1[MAX],str2[MAX],str3[MAX]; int i,j=0,count=0; printf("Input string 1: "); gets(str1); printf("\nInput string 2: "); gets(str2); for(i=0;str1[i]!='\0';i++) //Copying string 1 to string 3 { str3[i]=str1[i]; count++; } for(i=count;str2[j]!='\0';i++) //Copying string 2 to the end of string 3 { str3[i]=str2[j]; j++; } str3[i]='\0'; printf("\nConcatenated string : "); puts(str3); return 0; } 

3) Mediante el uso de la función strcat ()

 #include  #include  #define MAX 100 int main() { char str1[MAX],str2[MAX]; printf("Input string 1: "); gets(str1); printf("\nInput string 2: "); gets(str2); strcat(str1,str2); //strcat() function printf("\nConcatenated string : "); puts(str1); return 0; } 

En C, realmente no tiene cadenas, como un objeto genérico de primera clase. Debes administrarlos como matrices de caracteres, lo que significa que debes determinar cómo te gustaría administrar tus matrices. Una forma es con las variables normales, por ejemplo, ubicadas en la stack. Otra forma es asignarlos dinámicamente utilizando malloc .

Una vez que haya ordenado, puede copiar el contenido de una matriz a otra, para concatenar dos cadenas usando strcpy o strcat .

Una vez dicho esto, C tiene el concepto de “cadenas literales”, que son cadenas conocidas en tiempo de comstackción. Cuando se usen, serán una matriz de caracteres ubicada en la memoria de solo lectura. Sin embargo, es posible concatenar dos literales de cadena escribiéndolos uno al lado del otro, como en "foo" "bar" , que creará la cadena literal “foobar”.