¿Cómo agrego dos cadenas?
Lo intenté name = "derp" + "herp";
, pero recibí 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 char
que termina 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 <stdlib.h>
#include <string.h>
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 de almacenamiento dinámico al llamante y transfiere la propiedad de esa memoria. Es responsabilidad de la persona que llama free
la memoria cuando ya no se necesita.
Llame a la función así:
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
Si le molesta el rendimiento, entonces querrá evitar escanear repetidamente las memorias intermedias de entrada en busca del 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 está planeando hacer mucho trabajo con cadenas, entonces es mejor que use un lenguaje diferente que tenga soporte de primera clase para cadenas.
return memcpy(result, s1, len1);
. Aunque una microoptimización o al menos un poco de código de golf, tales mejoras potenciales en las operaciones básicas de cadena pueden tener valor dado su alto uso.stpcpy
, que devuelve un puntero al final de la primera cadena:strcpy(stpcpy(result, s1), s2);
fuente
David Heffernan explicó el problema en su respuesta y yo escribí el código mejorado. Vea abajo.
Una función genérica
Podemos escribir una función variada útil para concatenar cualquier número de cadenas:
Uso
Salida:
Limpiar
Tenga en cuenta que debe liberar la memoria asignada cuando sea innecesaria para evitar pérdidas de memoria:
fuente
int len
->size_t len
comosize_t
es el tipo correcto para el código de "tamaño". También// room for NULL
->// room for null character
NULL
implica el puntero nulo.Asumiré que lo necesitas para cosas únicas. Asumiré que eres un desarrollador de PC.
Usa la pila, Luke. Úselo en todas partes. No use malloc / free para pequeñas asignaciones, nunca .
Si 10 KB por cadena no son suficientes, agregue un cero al tamaño y no se moleste, de todos modos liberarán su memoria de pila al final de los ámbitos.
fuente
snprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
Deberías usar
strcat
, o mejorstrncat
,. Google (la palabra clave es "concatenación").fuente
strncat()
es una función endiabladamente difícil de usar correctamente. Rápidamente, sin mirar el manual, ¿a qué longitud especificasstrncat()
? Si dijiste "la longitud del búfer", acabas de demostrar mi punto muy bien. Tiene una interfaz contra-intuitiva y cuando tiene suficientes datos para usarla de manera segura, no necesita usar la función en primer lugar; existen otras alternativas más rápidas y más eficientes (comostrcpy()
omemmove()
) que podrían usarse en lugar. Cualquiera que sea la pregunta de "qué debo usar",strncat()
no es la respuesta.No puede agregar literales de cadena como ese en C. Debe crear un búfer de tamaño de literal de cadena uno + literal de cadena dos + un byte para el carácter de terminación nula y copiar los literales correspondientes a ese búfer y también asegurarse de que sea nulo terminado . O puede usar funciones de biblioteca como
strcat
.fuente
Sin extensión GNU:
Alternativamente con la extensión GNU:
Vea malloc , gratis y asprintf para más detalles.
fuente
fuente
Concatenar cadenas
La concatenación de dos cadenas en C se puede hacer de al menos 3 formas: -
1) Al copiar la cadena 2 al final de la cadena 1
2) Al copiar la cadena 1 y la cadena 2 a la cadena 3
3) Al usar la función strcat ()
fuente
En C, realmente no tiene cadenas, como un objeto genérico de primera clase. Debe administrarlos como matrices de caracteres, lo que significa que debe determinar cómo desea administrar sus matrices. Una forma es a las variables normales, por ejemplo, colocadas en la pila. Otra forma es asignarlos dinámicamente usando
malloc
.Una vez que haya ordenado eso, puede copiar el contenido de una matriz a otra, para concatenar dos cadenas usando
strcpy
ostrcat
.Dicho esto, C tiene el concepto de "literales de cadena", que son cadenas conocidas en tiempo de compilación. Cuando se usen, serán una matriz de caracteres colocada 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"
, lo que creará el literal de cadena "foobar".fuente
usando memcpy
fuente