• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Функция Substr

  • Автор темы shisik
  • Дата начала
S

shisik

У меня возникла необходимость выделить часть произвольной строки, скажем, с 5 символа и длиной 7 символов (например). Стандартную такую функцию я не нашел (может, плохо искал). Решил написать свою - благо, сложного в ней вроде ничего нет. В итоге получился следующий код:
Код:
typedef char *PCHAR;

PCHAR substr(const char *src, int from, int size)
{
char * c_TmpStr = new char[size + 1];
int j = 0;
for (int i = from; i < from + size; i++)
c_TmpStr[j++] = src[i];
c_TmpStr[size] = 0;
return c_TmpStr;
}
Функция работает, нармально выделяет подстроку из строки. Проблема заключается в следующем: я не уверен, что временный массив корректно удаляется и не присходит "утечки памяти". Я имею ввиду строку char * c_TmpStr = new char[size + 1]; Удалять её в самой функции я не могу, т.к. мне надо вернуть результат. Есть вариант удалять строку после вызова функции:
Код:
char * tmp = substr("some string", 3, 5);
//работа с полученной строкой
delete [] tmp;
Но этот способ не совсем удобен, т.к. функция должна быть полностью автономной.
Может кто сталкивался с подобной проблемой?
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
стандартная strstr, если не ошибаюсь.
и вообще используейте std::string
 
G

grigsoft

ну так либо требуй передавать буфер для строки в функцию, либо требуй удалять память самостоятельно. Второе, конечно, чревато, потерями. Функция твоя, кстати, должна бы проверять параметры на валидность и границы.
Да, то что ты делаешь делается через strncpy(result, str+from, size).
 
S

shisik

grigsoft спасибо.

Рано я обрадовался :huh: Функция strncpy не делает одной очень важной вещи: не добовляет 0 в конец строки. Следствие - полученная строка некорректно обрабатывается следующими функциями :( В принципе можно после вызова strncpy проделывать что-то вроде str[size] = 0;, но это опять же делает функцию не совсем самостоятельной. Думаю, лучше всего будет написать исправленную strncpy с добавлением этого нуля...
P.S. Kmet, функция strstr выполняет другую задачу :( А std::string не подходит, т.к. данные приходят в виде массива char...
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
std::string ( const char * s );
Content is initialized to a copy of the string formed by the null-terminated character sequence (C string) pointed by s. The length of the caracter sequence is determined by the first occurrence of a null character (as determined by traits.length(s)). This version can be used to initialize a string object using a string literal constant.
 
Y

Yason

shisik
В Win32 API все функции работы со строками требуют передачи target буфера и его размера в виде параметра. Взять хотя бы ту же strncpy:
Код:
char *strncpy(char *dest, const char *src, size_t maxlen);
Таким образом, буфер нужно будет явно выделить перед вызовом, зато уменьшается вероятность, что забудешь освободить :)

А насчёт "не добавляет 0 в конец строки"
The target string, dest, might not be null-terminated if the length of src is maxlen or more.
 
B

biz

Для shisik

вот оптимальный вариант:

Код:
void substr( char *dst, char *src, int from, int size )
{
src += from;
while ( size-- ) *dst++ = *src++;
*dst = '\0';
}

размер dst заранее обговариваешь, или просто динамически выделяешь для него память вне функции, а потом так-же ее и там же освобождаешь!...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!