Форум программистов, компьютерный форум CyberForum.ru

Чем можно заменить функцию strdup - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:18     Чем можно заменить функцию strdup #1
Здравствуйте. Я хочу использовать в своем проекте одну библиотеку, но компилятор мне ругается при сборке, что ф-я strdup не объявлена. Смотрел в заголовочный файл string.h, там она присутствует. Чем можно ее заменить или как ее написать самому?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 14:18     Чем можно заменить функцию strdup
Посмотрите здесь:

C++ strdup(), strcpy()
C++ на что можно заменить функцию?
C++ Чем можно заменить выражение b=SQEARE(4,5+2,5)?
чем можно заменить функцию setlocale(LC_ALL, "RUSSIAN"); C++
C++ Чем можно заменить Switch -- case ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
25.01.2014, 14:24     Чем можно заменить функцию strdup #2
Примерно так. Только не забудь освобождать память.

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string.h>
 
char* strdup(char s)
{
     char *r;
     int  i,l;
     l=strlen(s)+1;
     r=new char[l];
     for (i=0; i<l; i++) r[i]=s[i];
     r[l]=0;
     return r;
}
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:34  [ТС]     Чем можно заменить функцию strdup #3
Спасибо за помощь. Но ваш вариант не совсем подходит, потому что вы выделяете память в С++ стайл а нужно Си. Нашел такой вариант
C++
1
2
3
4
5
6
char *strdup (const char *s) {
    char *d = malloc (strlen (s) + 1);   // Space for length plus nul
    if (d == NULL) return NULL;          // No memory
    strcpy (d,s);                        // Copy the characters
    return d;                            // Return the new string
}

Не по теме:


Ехх, на один костыль уже в моем проекте больше

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
25.01.2014, 14:38     Чем можно заменить функцию strdup #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstring>
#include <iostream>
 
char* my_strdup(const char* source)
{
    unsigned int len = strlen(source) + 1;
    char *buf = (char*)malloc(len);
    memmove(buf, source, len);
    return buf;
}
 
 
int main()
{
    char str[256] = "Orange apple";
    char *istr = my_strdup(str);
    printf ("%s\n", istr);
    free(istr);
}
Добавлено через 1 минуту
strdup - это вообще пережиток С.
В чем возникла потребность использовать вообще сишные функции?
В С++ существует std::string.
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:44  [ТС]     Чем можно заменить функцию strdup #5
MrGluck, да я знаю что это не стандартная ф-я. Я что виноват, что автор нужной мне библиотеки ее использует? Или вы мне предлагаете переписать тонны кода через std::string?
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
25.01.2014, 14:46     Чем можно заменить функцию strdup #6
Цитата Сообщение от anubis1768 Посмотреть сообщение
Ехх, на один костыль уже в моем проекте больше
- а чего все так этого боятся? Главное - чтобы программа работала верно. Все остальное (в т.ч. и изящество кода) - вторично.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
25.01.2014, 14:51     Чем можно заменить функцию strdup #7
Цитата Сообщение от anubis1768 Посмотреть сообщение
Я что виноват, что автор нужной мне библиотеки ее использует?
он что под угрозой смерти заставил вас её использовать?
Инструментарий выбираете вы. Ничто не мешает написать поверх обертку или же даже проще: найти реализацию этой функции в каком-нибудь gcc и просто скопировать исходник. Она наверняка небольшая.

Что то вы резко отреагировали. Я всего лишь спросил причину и указал что просто так использовать массивы char и сишные функции нерационально в плюсах.

Да и действительно, непонятно - чего вы боитесь?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.01.2014, 14:57     Чем можно заменить функцию strdup #8
Цитата Сообщение от MrGluck Посмотреть сообщение
использовать массивы char и сишные функции нерационально в плюсах.
Цитата Сообщение от anubis1768 Посмотреть сообщение
выделяете память в С++ стайл а нужно Си.
странно, что тема при этом в разделе плюсов.
C++
1
2
3
4
5
6
char *strdup (const char *s) {
    char *d = malloc (strlen (s) + 1);   // Space for length plus nul
    if (d == NULL) return NULL;          // No memory
    strcpy (d,s);                        // Copy the characters
    return d;                            // Return the new string
}
Цитата Сообщение от MrGluck Посмотреть сообщение
memmove(buf, source, len);
memmove без особой надобности использовать не стоит. Она более тяжелая чем memcpy или strcpy, т.к. учитывает вариант пересекающихся областей памяти.
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:59  [ТС]     Чем можно заменить функцию strdup #9
MrGluck, по сути эта библиотека единственный подходящий аналог парсера tmx. А насчет костыля: все файлы, в которых была эта ошибка использовали tinyxml вот и я добавил в tinyxml strdup, чтобы не добавлять какие то новые файлы, а это, я думаю, плохое решение, хоть и работает. Быть может я просто параноик или перфекционист?
MrGluck
25.01.2014, 15:04
  #10

Не по теме:

Мне больше симпатизирует pugixml. Там и for-цикл по коллекции поддерживает и юникод(wchar в который можно его запихнуть) и оно вроде даже как патриотично(делалдопиливал с какой-то уже готовой либы наш соотечественник)

Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
25.01.2014, 18:09     Чем можно заменить функцию strdup #11
Цитата Сообщение от Tulosba Посмотреть сообщение
странно, что тема при этом в разделе плюсов.
- вот поэтому и я использовал new (вместо malloc)...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
25.01.2014, 18:17     Чем можно заменить функцию strdup #12
Catstail, не очень хорошо, учитывая что от функции предполагается потом освобождение через free, судя по описанию. Думаю, если ТС меняет stdup на пользовательскую, то указатели все же будут перехватываться и удаляться через free.
Catstail
Модератор
 Аватар для Catstail
21434 / 10219 / 1666
Регистрация: 12.02.2012
Сообщений: 17,092
25.01.2014, 18:37     Чем можно заменить функцию strdup #13
Цитата Сообщение от MrGluck Посмотреть сообщение
Catstail, не очень хорошо, учитывая что от функции предполагается потом освобождение через fre
- согласен, хотя у ТС про free - ни слова. Кстати, о необходимости освобождения памяти я предупредил (естественно, с использованием delete из C++)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
25.01.2014, 18:44     Чем можно заменить функцию strdup #14
у ТС то да, но спецификация функции такая.
http://www.opennet.ru/man.shtml?topi...ry=3&russian=2
да и как иначе в сях то освобождать. Поэтому я и предлагаю написать свою обертку т.к. чреваты потенциальные утечки, что всегда бывает когда начинают мешать два языка в одну кашу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 19:14     Чем можно заменить функцию strdup
Еще ссылки по теме:

C++ Чем можно заменить старинную библиотеку graphics.h в VS?
C++ Можно ли это заменить чем-то менее объёмным
C++ Чем можно заменить функцию swap?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.01.2014, 19:14     Чем можно заменить функцию strdup #15
Когда сишную тему размещают в плюсовом разделе срача не избежать.

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
два языка в одну кашу.
м.б. кучу?

Yandex
Объявления
25.01.2014, 19:14     Чем можно заменить функцию strdup
Ответ Создать тему
Опции темы

Текущее время: 01:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru