Функция Substr

Тема в разделе "Общие вопросы по С и С++", создана пользователем shisik, 15 апр 2008.

  1. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    У меня возникла необходимость выделить часть произвольной строки, скажем, с 5 символа и длиной 7 символов (например). Стандартную такую функцию я не нашел (может, плохо искал). Решил написать свою - благо, сложного в ней вроде ничего нет. В итоге получился следующий код:
    Код (Text):
    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]; Удалять её в самой функции я не могу, т.к. мне надо вернуть результат. Есть вариант удалять строку после вызова функции:
    Код (Text):
    char * tmp = substr("some string", 3, 5);
    //работа с полученной строкой
    delete [] tmp;
    Но этот способ не совсем удобен, т.к. функция должна быть полностью автономной.
    Может кто сталкивался с подобной проблемой?
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    стандартная strstr, если не ошибаюсь.
    и вообще используейте std::string
     
  3. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    ну так либо требуй передавать буфер для строки в функцию, либо требуй удалять память самостоятельно. Второе, конечно, чревато, потерями. Функция твоя, кстати, должна бы проверять параметры на валидность и границы.
    Да, то что ты делаешь делается через strncpy(result, str+from, size).
     
  4. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    grigsoft спасибо.

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
     
  6. Yason

    Yason Гость

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

    А насчёт "не добавляет 0 в конец строки"
     
  7. biz

    biz Гость

    Для shisik

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

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

Поделиться этой страницей