Anexar cadena C

4 minutos de lectura

avatar de usuario
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.

  • 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, str2y new_stry use strncat en lugar de solo strcat). Ayudará a evitar algunos errores de desbordamiento de búfer.

    – Brendan largo

    5 mayo 2011 a las 16:38

avatar de usuario
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

avatar de usuario
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

avatar de usuario
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

avatar de usuario
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

avatar de usuario
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);
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad