Подтвердить что ты не робот

Добавление строки C

Я хочу добавить две строки. Я использовал следующую команду:

new_str = strcat(str1, str2);

Эта команда изменяет значение str1. Я хочу new_str быть конкатенацией str1 и str2, и в то же время str1 не следует изменять.

4b9b3361

Ответ 1

Вам также нужно выделить новое пространство. Рассмотрим этот фрагмент кода:

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

Возможно, вы захотите рассмотреть strnlen(3), который немного безопаснее.

Обновлено, см. выше. В некоторых версиях среды выполнения C память, возвращаемая malloc, не инициализируется значением 0. Я полагаю, что для новой спецификации C на самом деле требуется malloc, но на всякий случай, если первый байт new_str равен нулю гарантирует, что он выглядит как пустая строка для strcat.

Ответ 2

выполните следующие действия:
strcat(new_str,str1);
strcat(new_str,str2);

Ответ 3

Сначала вам нужно strncpy str1 в new_string.

Ответ 4

Я пишу строку поддержки поддержки динамической переменной, например PHP str append: str + str +... и т.д.

#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;
}

Ответ 5

Вы можете использовать asprintf, чтобы объединить оба в новую строку:

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

Ответ 6

Мне нужно было добавить подстроки для создания команды ssh, я решил с помощью 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);
}

Ответ 7

Рассмотрим использование большой, но неизвестной функции open_memstream().

FILE *open_memstream(char **ptr, size_t *sizeloc);

Пример использования:

// 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);

Если вы заранее не знаете длину того, что хотите добавить, это удобно и безопаснее, чем управление буферами.

Ответ 8

strcpy(str1+strlen(str1), str2);

Ответ 9

man-страница strcat говорит, что arg1 и arg2 добавляются в arg1.. и возвращают указатель s1. Если вы не хотите беспокоить str1, str2, тогда вы должны написать свою собственную функцию.

char * my_strcat(const char * str1, const char * str2)
{
   char * ret = malloc(strlen(str1)+strlen(str2));

   if(ret!=NULL)
   {
     sprintf(ret, "%s%s", str1, str2);
     return ret;
   }
   return NULL;    
}

Надеюсь, что это решает вашу цель.