Вы можете использовать strdup()
для возврата копии C-строки, например:
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
stringB = strdup(stringA);
/* ... */
free(stringB);
Вы также можете использовать strcpy()
, но вам нужно сначала выделить место, что не сложно сделать, но может привести к ошибке переполнения, если не все сделано правильно:
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
/* you must add one to cover the byte needed for the terminating null character */
stringB = (char *) malloc( strlen(stringA) + 1 );
strcpy( stringB, stringA );
/* ... */
free(stringB);
Если вы не можете использовать strdup()
, я бы порекомендовалиспользование strncpy()
вместо strcpy()
.Функция strncpy()
копирует до - и только до - n
байтов, что помогает избежать ошибок переполнения.Однако, если strlen(stringA) + 1 > n
, вам придется прекратить stringB
самостоятельно.Но, как правило, вы будете знать, какие размеры вам нужны для вещей:
#include <string.h>
const char *stringA = "foo";
char *stringB = NULL;
/* you must add one to cover the byte needed for the terminating null character */
stringB = (char *) malloc( strlen(stringA) + 1 );
strncpy( stringB, stringA, strlen(stringA) + 1 );
/* ... */
free(stringB);
Мне кажется, strdup()
чище, поэтому я стараюсь использовать его для работы исключительно со строками.Я не знаю, есть ли серьезные недостатки в подходе POSIX / non-POSIX, с точки зрения производительности, но я не эксперт C или C ++.
Обратите внимание, что я приведу результат malloc()
кchar *
.Это потому, что ваш вопрос помечен как c++
вопрос.В C ++ требуется привести результат из malloc()
.В C, однако, вы бы не разыгрывали это.
РЕДАКТИРОВАТЬ
Итак, есть одно осложнение: strdup()
не вC или C ++.Поэтому используйте strcpy()
или strncp()
с массивом предварительно заданного размера или с указателем malloc
.Хорошей привычкой является использование strncp()
вместо strcpy()
, где бы вы ни использовали эту функцию.Это поможет снизить вероятность ошибок.