Функция используется для создания копии c-строк. Это часто необходимо, чтобы получить доступную для записи версию строкового литерала. Они (строковые литералы) сами по себе не доступны для записи, поэтому такая функция копирует их в выделенный доступный для записи буфер. Затем вы можете передать их функциям, которые изменяют заданный аргумент, например strtok
, который записывает в строку, которую он должен токенизировать.
Я думаю, вы можете придумать что-то вроде этого, так как оно называется new strdup :
char * newstrdup(char const* str) {
char *c = new char[std::strlen(str) + 1];
std::strcpy(c, str);
return c;
}
Вы должны были бы освободить его, когда закончите, используя строку, используя
delete[] *string;
Альтернативный способ написания - использование malloc
. Если библиотека старая, она могла использовать ту, которую C ++ унаследовал от C:
char * newstrdup(char const* str) {
char *c = (char*) malloc(std::strlen(str) + 1);
if(c != NULL) {
std::strcpy(c, str);
}
return c;
}
Теперь вы должны освободить строку, используя free
, когда закончите:
free(*string);
Предпочитайте первую версию, если вы пишете на C ++. Но если существующий код использует free
для освобождения памяти снова, используйте вторую версию. Помните, что вторая версия возвращает NULL
, если нет памяти для дублирования строки, в то время как первая выдает исключение в этом случае. Еще одно замечание следует сделать о поведении, когда вы передаете аргумент NULL
в newstrdup
. В зависимости от вашей библиотеки это может быть разрешено или не разрешено. Поэтому вставьте соответствующие проверки в вышеуказанные функции, если это необходимо. В системах POSIX доступна функция с именем strdup
, но она не допускает аргументов NULL
и не использует оператор C++
new для выделения памяти.
Во всяком случае, я искал с помощью Google codesearch функции newstrdup
и нашел немало. Может быть, ваша библиотека в числе результатов:
Google CodeSearch, newstrdup