объединить массив символов в C - PullRequest
34 голосов
/ 07 февраля 2010

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

char* name = "hello";

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

hello.txt

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

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

Ответы [ 7 ]

53 голосов
/ 07 февраля 2010

Посмотрите на функцию 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 */
17 голосов
/ 08 февраля 2010

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

char* name = "hello";

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

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

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

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

Надеюсь, это поможет вам понять, почему ваш отрывок не работает. Другие обрисовали в общих чертах, какие изменения необходимы, чтобы заставить это работать. В основном вам нужен массив символов (массив символов), достаточно большой, чтобы хранить всю строку с завершающим (завершающим) символом '\ 0'. Затем вы можете использовать стандартную функцию библиотеки C strcpy (или, еще лучше, strncpy), чтобы скопировать в нее «Hello», и затем вы хотите объединить, используя стандартную функцию библиотеки C языка strcat (или, еще лучше, strncat). Вы захотите включить заголовочный файл 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;
}
11 голосов
/ 07 февраля 2010

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

Например, вы можете сделать:

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

strcpy( dest, str );
strcat( dest, ".txt" );
5 голосов
/ 30 сентября 2011

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

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

asprintf(&cat, "%s%s", hi, ext);
5 голосов
/ 08 февраля 2010

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

1 голос
/ 08 февраля 2010
#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
}
0 голосов
/ 23 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...