Функция Substr

shisik

Well-known member
26.08.2007
154
0
#1
У меня возникла необходимость выделить часть произвольной строки, скажем, с 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

Java Team
25.05.2006
1 036
8
#2
стандартная strstr, если не ошибаюсь.
и вообще используейте std::string
 

grigsoft

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

shisik

Well-known member
26.08.2007
154
0
#4
grigsoft спасибо.

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

Kmet

Java Team
25.05.2006
1 036
8
#5
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

#6
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
#7
Для shisik

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

Код:
void substr( char *dst, char *src, int from, int size )
{
src += from;
while ( size-- ) *dst++ = *src++;
*dst = '\0';
}
размер dst заранее обговариваешь, или просто динамически выделяешь для него память вне функции, а потом так-же ее и там же освобождаешь!...