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

    +78

    1. 1
    2. 2
    3. 3
    4. 4
    int strlenw(const wchar_t *s)
    {
    	return (int)((int)(strlen(s)) % sizeof(wchar_t));
    };

    Даже и не знаю что сказать. Это было в доставшемся мне проекте. Мне кажется это говнокод.

    Запостил: Говногость, 11 Января 2010

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

    • показать все, что скрытоГде здесь С++?
      Ответить
    • Ну (int) это понятно — многие компиляторы (а особенно msvc) выдают предупреждение о несоответствии типов size_t и int
      А так, да, sort of говнокод.
      Ответить
    • Согласен, говнокод, даже улыбнуло) Не сам придумал? Чтобы реально такое где-то написать надо быть знатным извращенцем.
      Ответить
    • Похоже, думать автору кода было лень и он напихал приведения типов куда только можно. Внешний (int) не нужен.

      Ещё странно, зачем такая функция вообще нужна (остаток деления строки на длину wchar_t). Чтобы узнать, можно ли представить строку как wchar-строку?
      Ответить
      • Ты о чем? И так wchar передается.
        Ответить
        • Передаётся-то wchar, а strlen считает количество char-ов.

          Обычно размер wchar -- два байта. Если остаток от деления длины строки (в char-ах, они же байты) на размер wchar нулевой, значит строка валидная (в ней помещается целое число wchar-ов). Если ненулевой, значит строка кривая.

          А вообще я о том, что мне непонятно, зачем эта функция используется.
          Ответить
          • strlen("string") = 6.
            6 % sizeof(wchar) = 0.

            strlen("stringPUMPURUM!") = 15.
            15 % sizeof(wchar) = 1.

            И?
            Ответить
            • И в чем прикол, что ты приводишь в пример 2 строки char*? Вбей что-то в стиле
              strlen(L"p\u0x00ff\u0xff00prara-pararam-pam-pam") и посмотри результат.

              f.ex.
              int _tmain(int argc, _TCHAR* argv[])
              {
              	wchar_t *param=L"p\u0x00ff\u0xff00prara-pararam-pam-pam";
              	printf("strlen((const char*)param)=%d\nwcslen((const wchar_t*)param)=%d", strlen((const char*)param),wcslen((const wchar_t*)param));
              	int n=10;
              	scanf("\n%d",n);
              	return 0;
              }


              резалт:
              strlen((const char*)param)=1
              wcslen((const wchar_t*)param)=36
              Ответить
    • индус ниасилил wcslen()
      К тому же если будет символ вида 0x00 0xXX, то strlen выдаст неправильный результат
      Ответить
      • да и strlen вроде на wchar_t * поругается варнингом - если его не исправлять то непонятно зачем все эти пляски с (int)
        Ответить
    • Нормальный компилятор сведёт это к
      strlen(s)&1
      Но извращение дикое, жаль, что нынче модно такое оправдывать "логичностью" и "читабельностью".
      Ответить
      • Ты дурочко - sizeof(wchar_t) == 2
        Ответить
        • Фигвам. GCC под linux-ом считает sizeof(wchar_t) == 4. Более того, указание -fshort-wchar конечно приводит к использованию 16-битовых unicode-символов, но валит программу по SIGSEGV при первом же обращении к любой wchar-функции.
          Ответить
          • Так про альтернативные оси никто не говорил :) Пользуйтесь православной виндой
            Ответить
            • Винда и есть альтернативная.
              Ответить
            • православной виндой??

              еретик!!
              Ответить
              • +1
                Ответить
              • <[:|||:]>
                Конечно, в винде иконки есть и службы проводятся.
                <\[:|||:]>
                Ответить
                • Кто-то когда-то сравнивал винду и линух -- службы и демоны.
                  Ответить
            • Сам ты альтернативная ОС. Си как раз таки родился в UNIX, а не в windows, между прочим.
              Ответить
        • i % sizeof(wchar_t) == i % 2 == i & 1
          Кто из нас дурочко?
          Ответить
    • Может это какая-то попытка получить длинну строки? Просто чувак протупил и / заменил на % ?
      Ответить
      • У меня тоже есть такое подозрение. Эта функция используеться только пару раз в проекте и судя по использующему её коду - так оно и есть.
        Ответить
        • если там нулевой байт до конца строки попадётся, то облом. по-любому не только знак менять надо.
          Ответить
          • Эмм.. Если попадется нулевой байт тебе strlen менять надо)
            Ответить
            • wchar_t как бы содержит 2 байта, один из которых может быть вполне нулевым
              Ответить
              • strlen об этом не знает.
                и не 2 там байта.
                Ответить
                • Про не да байта уже говорить бессмысленно: люди читают с конца походу.
                  Ответить
          • Человек не случайно это говно выложил. Хорошо, что хоть не весь проект на этом построен. :)
            Ответить
            • А ты откуда знаешь? Может он копипастил себе в калькулятор для института и случайно вставил в браузер, а потом в панике нажал кнопку!.. Амфетамины они такие...
              Ы)
              Ответить
            • Дак выше об этом сказано. Читай внимательнее.
              Ответить
    • wchat_t обычно используется для UTF-16. следовательно, для английских символов, каждый двухбайтный символ будет содержать байт с нулем. соответственно strlen заткнется на первом же символе и вернет 1 или 0 (в зависимости от Big/Little Endian)
      Ответить

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