1. C++ / Говнокод #12874

    +13

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    std::string StringUtilities::replace(const std::string& strValue,
                                         uint8_t piWhat,
                                         uint8_t piWith)
    {  
      size_t len = strValue.length();
      uint8_t* lTemp = new uint8_t[len + 1];
      memset(lTemp, '\0', len + 1); //+ 1 for \0
      memcpy(lTemp, strValue.c_str(), len);
      for (size_t i = 0; i < len; i++)
      {
        if (lTemp[i] == piWhat)
          lTemp[i] = piWith;
      }
      return string( (int8_t*) lTemp );  
    }

    Любители велосипедов...

    Запостил: blackhearted, 10 Апреля 2013

    Комментарии (12) RSS

    • std::replace(strValue.begin(), strValue.end(), piWhat, piWith)
      ?
      Ответить
    • StringUtilities небось ещё и класс, а replace - статический метод? Кто-то накурился сишарпов?
      Ответить
    • Это просто рассадник вкуснятины. Предположим, исходную строку менять не нужно, и про стандартный replace мы забыли.
      1. Результирующую строку можно аллоцировать заранее без new, её размер известен. Или типа RVO, ололо?
      2. Конечно, по строке нужно пройтись трижды: сначала забить её нулями (!), потом всё это переписать содержимым строки, и потом заменить свежескопированные символы. Круть.
      3. Зачем выделять память в uint8, который потом кастится в int8_t, который, по счастливому совпадению, является разновидностью char?
      Ответить
      • Там, кстати, у стринга есть конструктор с длиной, который позволил бы убрать лишний замер длины в строке 14.
        Ответить
      • Всегда радж покормить.
        После строки 14, кстати, лик.
        lTemp не удалён :)
        Ответить

    Добавить комментарий