Quiero añadir dos cadenas. Utilicé el siguiente comando:
new_str = strcat(str1, str2);
Este comando cambia el valor de str1
. quiero new_str
ser la concatenación de str1
y str2
y al mismo tiempo str1
no se debe cambiar.
Udara SS Liyanage
Quiero añadir dos cadenas. Utilicé el siguiente comando:
new_str = strcat(str1, str2);
Este comando cambia el valor de str1
. quiero new_str
ser la concatenación de str1
y str2
y al mismo tiempo str1
no se debe cambiar.
charlie martin
También debe asignar un nuevo espacio. Considere este fragmento de código:
char * new_str ;
if((new_str = malloc(strlen(str1)+strlen(str2)+1)) != NULL){
new_str[0] = '\0'; // ensures the memory is an empty string
strcat(new_str,str1);
strcat(new_str,str2);
} else {
fprintf(STDERR,"malloc failed!\n");
// exit?
}
Es posible que desee considerar strnlen(3)
que es un poco más seguro.
Actualizado, véase más arriba. En algunas versiones del tiempo de ejecución de C, la memoria devuelta por malloc
no se inicializa a 0. Establecer el primer byte de new_str
a cero asegura que parece una cadena vacía para strcat.
malloc
siempre puede devolver la basura, y lo hace incluso en los sistemas modernos. calloc
te da memoria cero.
– Kornel
22 de diciembre de 2012 a las 23:32
Y calloc también suele tomar tamaño de (espacio) tiempo para hacerlo. Si está haciendo muchas cadenas y tiene cuidado con sus punteros, puede guardar muchas instrucciones redundantes.
– Charlie Martín
24 de diciembre de 2012 a las 4:01
Elimine la conjetura incorrecta: “Creo que la nueva especificación C en realidad requiere que malloc lo haga”. Además, establecer el primer byte en cero HACE que sea una cadena de longitud cero por definición (no parece).
– Michael Labbé
24 de mayo de 2016 a las 6:07
Hacer el memoria parece una cadena vacía. La memoria devuelta por malloc, a la que hace referencia un void *
no es nada, por definición.
– Charlie Martín
24 mayo 2016 a las 13:24
VirtualTroll
Haz lo siguiente:
strcat(new_str,str1);
strcat(new_str,str2);
Con la advertencia de que new_str debe inicializarse en una cadena vacía.
– individuo
5 mayo 2011 a las 16:38
Esto falla cuando new_str no puede contener el espacio o (*new_str) != 0
– Michael Labbé
24 de mayo de 2016 a las 5:59
Esto me sigue dando “falla de segmentación”
– Sara
13 de septiembre de 2020 a las 17:47
Considere usar la gran pero desconocida función open_memstream().
FILE *open_memstream(char **ptr, size_t *sizeloc);
Ejemplo de uso:
// open the stream
FILE *stream;
char *buf;
size_t len;
stream = open_memstream(&buf, &len);
// write what you want with fprintf() into the stream
fprintf(stream, "Hello");
fprintf(stream, " ");
fprintf(stream, "%s\n", "world");
// close the stream, the buffer is allocated and the size is set !
fclose(stream);
printf ("the result is '%s' (%d characters)\n", buf, len);
free(buf);
Si no sabe de antemano la longitud de lo que desea agregar, esto es conveniente y más seguro que administrar los búferes usted mismo.
Vale la pena señalar que open_memstream
es parte de POSIX, no del estándar ISO C. Por lo tanto, no está disponible en sistemas que no sean Unix, como Windows, y ni siquiera en todos los Unix. strcat
es una solución más portátil.
– DenisWashington
30 de diciembre de 2021 a las 10:46
joel falcou
Tendrás que strncpy
str1
dentro new_string
primero luego.
podrías usar asprintf
para concatenar ambos en una nueva cadena:
char *new_str;
asprintf(&new_str,"%s%s",str1,str2);
Esto es intrínsecamente específico de las plataformas en las que asnprintf
aunque está disponible. No es “estándar”.
– lpapp
3 de diciembre de 2014 a las 11:39
Wei
Escribo una función que admite la adición de cadenas de variables dinámicas, como PHP str append: str + str + … etc.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
int str_append(char **json, const char *format, ...)
{
char *str = NULL;
char *old_json = NULL, *new_json = NULL;
va_list arg_ptr;
va_start(arg_ptr, format);
vasprintf(&str, format, arg_ptr);
// save old json
asprintf(&old_json, "%s", (*json == NULL ? "" : *json));
// calloc new json memory
new_json = (char *)calloc(strlen(old_json) + strlen(str) + 1, sizeof(char));
strcat(new_json, old_json);
strcat(new_json, str);
if (*json) free(*json);
*json = new_json;
free(old_json);
free(str);
return 0;
}
int main(int argc, char *argv[])
{
char *json = NULL;
str_append(&json, "name: %d, %d, %d", 1, 2, 3);
str_append(&json, "sex: %s", "male");
str_append(&json, "end");
str_append(&json, "");
str_append(&json, "{\"ret\":true}");
int i;
for (i = 0; i < 10; i++) {
str_append(&json, "id-%d", i);
}
printf("%s\n", json);
if (json) free(json);
return 0;
}
Esto es intrínsecamente específico de las plataformas en las que asnprintf
aunque está disponible. No es “estándar”.
– lpapp
3 de diciembre de 2014 a las 11:39
Zac
Necesitaba agregar subcadenas para crear un comando ssh, lo resolví con sprintf
(Visual Studio 2013)
char gStrSshCommand[SSH_COMMAND_MAX_LEN]; // declare ssh command string
strcpy(gStrSshCommand, ""); // empty string
void appendSshCommand(const char *substring) // append substring
{
sprintf(gStrSshCommand, "%s %s", gStrSshCommand, substring);
}
Tienes razón, eso es lo que hace.
– Charlie Martín
5 mayo 2011 a las 16:35
Por varias razones, es posible que desee realizar un seguimiento de los tamaños de
str1
,str2
ynew_str
y usestrncat
en lugar de solostrcat
). Ayudará a evitar algunos errores de desbordamiento de búfer.– Brendan largo
5 mayo 2011 a las 16:38