Кресты / Говнокод #4093 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
int mr_word_compare(const char* r1, int s1, const char* r2, int s2)
{
   char* p1 = (char*)r1;
   char* p2 = (char*)r2;
   while (*p1 != ' ')
      ++ p1;
   *p1 = '\0';
   while (*p2 != ' ')
      ++ p2;
   *p2 = '\0';

   int res = strcmp(r1, r2);
   *p1 = ' ';
   *p2 = ' ';

   return res;
}

Запостил: vayerx vayerx, (Updated )

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

    • > кстати, а где тут с++?

      В С по умолчанию строковые литералы не есть конст. В С++ литералы - всегда конст.

      вызов функции `mr_word_compare("hello ", "hello ")` в классическом С будет работать - а в С++ сразу повалится на записе нулей в строки.

      НО. почти все современные С компиляторы литералы тоже делают рид-онли - не смотря на то что их тип в С остался "char *" а не как в С++ "const char *".

      т.е. фактически здесь С++ нету....
      Ответить
  • > а где тут с++?
    Не начинай...
    Я вот жду, когда автор придет и скажет "тут им пришлось const char* в аргументе объявить, потому что передают строку в виде "блабла"... ". Только вдумайтесь. Но, раз я это придумал раньше, чем vayerx, то
    vayerx, что ты имел ввиду?
    Так, ну игнор s1 и s2 я увидел не сразу, но комплятор должен много пиздеть насчет этого.Насчет того, что человек не в теме за указатели это понятно. Всё?
    Ответить
    • проверка показала, что компилер даже намёка не делает, и доступ к участку памяти осуществляется;

      компилер: Ембаркадеро Рад студия С++ 10 (консоль(С и С++), без вцл)
      Ответить
      • Но моя ракета взлетала тысячи раз, почему же она упала? Что сделать? Какой malloc? (c)
        Ответить
        • ну, гавнецом тут очень сильно заваняет, если в строке нету пробелов...

          зы: зачем придумывалась эта функция даже знать не хочется, она практически не имеет смысла (либо крайне специфический: сравнение строк по первому слову в строке)

          а так - наглядно показано, что спецификатор конст - можно обойти;
          Ответить
          • >спецификатор конст - можно обойти;
            В плюсах много чего можно, если ЯВНО постараться.
            Защита же в большей степени сделана для исключения неявных ошибок.
            Ответить
    • за c++ - да, на автомате поставил - код из плюсового проекта.
      все найденные втфы:
      1. двухкратный проход по строкам
      2. собственная реализация без strcmp была бы короче
      и, как уже писали:
      3. запись в константные строки
      4. неиспользование s1,s2 - длин буферов.
      не говоря об интуитивно понятных идентификаторах
      Ответить
  • Кстати, насчёт "а где тут с++?" Т.к большинство говнокода можно отнести и туда и туда, может объединить разделы С и С++ ?
    Ответить
    • Не надо так делать.
      Я например не большой спец в плюсах, и некоторые шутки могу не понять. А С понимаю.
      Все таки это разные языки.
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8