web-dev-qa-db-fra.com

C string ajouter

Je veux ajouter deux chaînes. J'ai utilisé la commande suivante:

new_str = strcat(str1, str2);

Cette commande change la valeur de str1. Je veux que new_str soit la concatanation de str1 et str2 et que, simultanément, str1 ne soit pas modifié.

39

Vous devez également allouer de nouveaux espaces. Considérons ce fragment de code:

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?
}

Vous voudrez peut-être envisager strnlen(3) qui est légèrement plus sûr.

Mise à jour , voir ci-dessus. Dans certaines versions du runtime C, la mémoire renvoyée par malloc n'est pas initialisée à 0. Définir le premier octet de new_str à zéro garantit qu'il ressemble à une chaîne vide à strcat.

56
Charlie Martin

faire ce qui suit: 

strcat(new_str,str1);
strcat(new_str,str2);
7
VirtualTroll

J'écris une chaîne de variable dynamique de support de fonction append, comme 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;
}
1
Wei

Vous devrez d'abord strncpystr1 dans new_string en premier.

1
Joel Falcou

J'avais besoin d'ajouter des sous-chaînes pour créer une commande ssh, que j'ai résolue avec 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);
}
0
Zac

Vous pouvez utiliser asprintf pour concaténer les deux en une nouvelle chaîne:

char *new_str;
asprintf(&new_str,"%s%s",str1,str2);
0
frmdstryr