Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
#1

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

25.01.2014, 14:18. Просмотров 1897. Ответов 14
Метки нет (Все метки)

Здравствуйте. Я хочу использовать в своем проекте одну библиотеку, но компилятор мне ругается при сборке, что ф-я strdup не объявлена. Смотрел в заголовочный файл string.h, там она присутствует. Чем можно ее заменить или как ее написать самому?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 14:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем можно заменить функцию strdup (C++):

Чем можно заменить функцию pow()? - C++
a=1/pow(2,n) как можно написать без pow?

Чем можно заменить функцию swap? - C++
Чем можно заменить функцию swap? Она на моем компиляторе не работает. Библиотеку iostream включал.

Чем можно заменить функцию sizeof()? - C++
Чем можно заменить sizeof() ,в задаче нельзя использовать стандартные функции строк Мне нужно найти длину слова

Чем можно заменить функцию setlocale(LC_ALL, "RUSSIAN")? - C++
напишите пожалуйста пример!!

Чем можно заменить Switch -- case ? - C++
Доброго времени суток, уважаемые форумчане! Помогите решить проблему с case. В этой программе нужно создать множественный выбор, который...

Чем можно заменить выражение b=SQEARE(4,5+2,5)? - C++
Объясните, пожалуйста, что это за функция

14
Catstail
Модератор
22838 / 11204 / 1812
Регистрация: 12.02.2012
Сообщений: 18,444
25.01.2014, 14:24 #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;
}
1
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:34  [ТС] #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
}

Не по теме:


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

0
MrGluck
Модератор
Эксперт CЭксперт С++
7491 / 4606 / 692
Регистрация: 29.11.2010
Сообщений: 12,596
25.01.2014, 14:38 #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.
0
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:44  [ТС] #5
MrGluck, да я знаю что это не стандартная ф-я. Я что виноват, что автор нужной мне библиотеки ее использует? Или вы мне предлагаете переписать тонны кода через std::string?
0
Catstail
Модератор
22838 / 11204 / 1812
Регистрация: 12.02.2012
Сообщений: 18,444
25.01.2014, 14:46 #6
Цитата Сообщение от anubis1768 Посмотреть сообщение
Ехх, на один костыль уже в моем проекте больше
- а чего все так этого боятся? Главное - чтобы программа работала верно. Все остальное (в т.ч. и изящество кода) - вторично.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7491 / 4606 / 692
Регистрация: 29.11.2010
Сообщений: 12,596
25.01.2014, 14:51 #7
Цитата Сообщение от anubis1768 Посмотреть сообщение
Я что виноват, что автор нужной мне библиотеки ее использует?
он что под угрозой смерти заставил вас её использовать?
Инструментарий выбираете вы. Ничто не мешает написать поверх обертку или же даже проще: найти реализацию этой функции в каком-нибудь gcc и просто скопировать исходник. Она наверняка небольшая.

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

Да и действительно, непонятно - чего вы боитесь?
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.01.2014, 14:57 #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, т.к. учитывает вариант пересекающихся областей памяти.
0
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
25.01.2014, 14:59  [ТС] #9
MrGluck, по сути эта библиотека единственный подходящий аналог парсера tmx. А насчет костыля: все файлы, в которых была эта ошибка использовали tinyxml вот и я добавил в tinyxml strdup, чтобы не добавлять какие то новые файлы, а это, я думаю, плохое решение, хоть и работает. Быть может я просто параноик или перфекционист?
0
MrGluck
25.01.2014, 15:04
  #10

Не по теме:

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

1
Catstail
Модератор
22838 / 11204 / 1812
Регистрация: 12.02.2012
Сообщений: 18,444
25.01.2014, 18:09 #11
Цитата Сообщение от Tulosba Посмотреть сообщение
странно, что тема при этом в разделе плюсов.
- вот поэтому и я использовал new (вместо malloc)...
0
MrGluck
Модератор
Эксперт CЭксперт С++
7491 / 4606 / 692
Регистрация: 29.11.2010
Сообщений: 12,596
25.01.2014, 18:17 #12
Catstail, не очень хорошо, учитывая что от функции предполагается потом освобождение через free, судя по описанию. Думаю, если ТС меняет stdup на пользовательскую, то указатели все же будут перехватываться и удаляться через free.
0
Catstail
Модератор
22838 / 11204 / 1812
Регистрация: 12.02.2012
Сообщений: 18,444
25.01.2014, 18:37 #13
Цитата Сообщение от MrGluck Посмотреть сообщение
Catstail, не очень хорошо, учитывая что от функции предполагается потом освобождение через fre
- согласен, хотя у ТС про free - ни слова. Кстати, о необходимости освобождения памяти я предупредил (естественно, с использованием delete из C++)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7491 / 4606 / 692
Регистрация: 29.11.2010
Сообщений: 12,596
25.01.2014, 18:44 #14
у ТС то да, но спецификация функции такая.
http://www.opennet.ru/man.shtml?topic=strdup&category=3&russian=2
да и как иначе в сях то освобождать. Поэтому я и предлагаю написать свою обертку т.к. чреваты потенциальные утечки, что всегда бывает когда начинают мешать два языка в одну кашу.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.01.2014, 19:14 #15
Когда сишную тему размещают в плюсовом разделе срача не избежать.

Не по теме:

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

0
25.01.2014, 19:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 19:14
Привет! Вот еще темы с ответами:

Чем можно заменить старинную библиотеку graphics.h в VS? - C++
Всем привет! Скажите, чем можно заменить старинную библиотеку graphics.h? Возможности нужны такие же, но что-то под VS надо...

Можно ли это заменить чем-то менее объёмным - C++
Можно ли это заменить чем-то менее объёмным... :scratch: if (stroka == 'А') x = 0, y = 0; else if (stroka == 'Б') x =...

на что можно заменить функцию? - C++
#include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; float yearzp(float z); //описание функции годовая 3/п const int m=20;...

О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? - C++
Вот есть такой оператор всеми программистами нелюбимый. Goto называется. Говорят, что его использование всегда можно обойти и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru