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

Конкатенировать массив char в C

У меня есть массив char:

char* name = "hello";

Я хочу добавить расширение к этому имени, чтобы сделать его

hello.txt

Как я могу это сделать?

name += ".txt" не будет работать

4b9b3361

Ответ 1

Посмотрите strcat.

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

const char* name = "hello";
const char* extension = ".txt";

char* name_with_extension;
name_with_extension = malloc(strlen(name)+1+4); /* make space for the new string (should check the return value ...) */
strcpy(name_with_extension, name); /* copy name into the new var */
strcat(name_with_extension, extension); /* add the extension */

Ответ 2

У меня есть массив char:

char* name = "hello";

Нет, у вас есть указатель на строковый литерал. Во многих применениях вы можете добавить модификатор const, в зависимости от того, интересуетесь ли вы тем, что указывает имя, или строковое значение, привет ". Вы не должны пытаться изменить литерал (" привет "), потому что могут случиться плохие вещи.

Самое главное, что C не имеет правильного (или первоклассного) строкового типа. "Строки" - это, как правило, массивы символов (символов) с завершающим символом "нуль" ( "\ 0" или десятичным 0) для обозначения конца строки или указателями на массивы символов.

Я бы предложил прочитать Character Arrays, раздел 1.9 в Язык программирования C (стр. 28 второе издание). Я настоятельно рекомендую прочитать эту небольшую книгу (< 300 страниц), чтобы узнать C.

В дополнение к вашему вопросу разделы 6 - Массивы и указатели и раздел 8 - Символы и строки C FAQ могут помочь. Вопрос 6.5, и 8.4 может быть хорошим местом для начала.

Я надеюсь, что это поможет вам понять, почему ваш отрывок не работает. Другие изложили, какие изменения необходимы, чтобы заставить его работать. В основном вам нужен массив char (массив символов), достаточно большой, чтобы хранить всю строку с завершающим (заканчивающимся) символом '\ 0'. Затем вы можете использовать стандартную библиотеку C библиотеки strcpy (или, еще лучше, strncpy), чтобы скопировать "Hello" в нее, а затем вы хотите объединиться с помощью стандартной функции stcc (или лучше всего strncat) библиотеки C). Вы хотите включить заголовочный файл string.h, чтобы объявить объявления функций.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
    char filename[128];
    char* name = "hello";
    char* extension = ".txt";

    if (sizeof(filename) < strlen(name) + 1 ) { /* +1 is for null character */
        fprintf(stderr, "Name '%s' is too long\n", name);
        return EXIT_FAILURE;
    }
    strncpy(filename, name, sizeof(filename));

    if (sizeof(filename) < (strlen(filename) + strlen(extension) + 1) ) {
        fprintf(stderr, "Final size of filename is too long!\n");
        return EXIT_FAILURE;
    }
    strncat(filename, extension, (sizeof(filename) - strlen(filename)) );
    printf("Filename is %s\n", filename);

    return EXIT_SUCCESS;
}

Ответ 3

Сначала скопируйте текущую строку в больший массив strcpy, затем используйте strcat.

Например, вы можете:

char* str = "Hello";
char dest[12];

strcpy( dest, str );
strcat( dest, ".txt" );

Ответ 4

Вы можете скопировать и вставить ответ здесь, или вы можете прочитать, что наш ведущий Джоэл говорит о strcat.

Ответ 5

asprintf не является 100% стандартным, но доступен через стандартные библиотеки C GNU и BSD, поэтому вы, вероятно, имеете его. Он выделяет выходные данные, поэтому вам не нужно сидеть и подсчитывать символы.

char *hi="Hello";
char *ext = ".txt";
char *cat;

asprintf(&cat, "%s%s", hi, ext);

Ответ 6

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *name = "hello";

int main(void) {
  char *ext = ".txt";
  int len   = strlen(name) + strlen(ext) + 1;
  char *n2  = malloc(len);
  char *n2a = malloc(len);

  if (n2 == NULL || n2a == NULL)
    abort();

  strlcpy(n2, name, len);
  strlcat(n2, ext, len);
  printf("%s\n", n2);

  /* or for conforming C99 ...  */
  strncpy(n2a, name, len);
  strncat(n2a, ext, len - strlen(n2a));
  printf("%s\n", n2a);

  return 0; // this exits, otherwise free n2 && n2a
}

Ответ 7

Вы можете объединять строки, используя функцию sprintf(). В вашем случае, например:

char file[80];
sprintf(file,"%s%s",name,extension);

И вы закончите с объединенной строкой в "файле".