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

0

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

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

Запостил: Говногость Говногость, (Updated )

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

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

    Ещё странно, зачем такая функция вообще нужна (остаток деления строки на длину wchar_t). Чтобы узнать, можно ли представить строку как 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
    Но извращение дикое, жаль, что нынче модно такое оправдывать "логичностью" и "читабельностью".
    Ответить
      • Фигвам. GCC под linux-ом считает sizeof(wchar_t) == 4. Более того, указание -fshort-wchar конечно приводит к использованию 16-битовых unicode-символов, но валит программу по SIGSEGV при первом же обращении к любой wchar-функции.
        Ответить
  • Может это какая-то попытка получить длинну строки? Просто чувак протупил и / заменил на % ?
    Ответить
    • У меня тоже есть такое подозрение. Эта функция используеться только пару раз в проекте и судя по использующему её коду - так оно и есть.
      Ответить
      • если там нулевой байт до конца строки попадётся, то облом. по-любому не только знак менять надо.
        Ответить
        • Эмм.. Если попадется нулевой байт тебе strlen менять надо)
          Ответить
          • wchar_t как бы содержит 2 байта, один из которых может быть вполне нулевым
            Ответить
              • Про не да байта уже говорить бессмысленно: люди читают с конца походу.
                Ответить
        • Человек не случайно это говно выложил. Хорошо, что хоть не весь проект на этом построен. 🙂
          Ответить
          • А ты откуда знаешь? Может он копипастил себе в калькулятор для института и случайно вставил в браузер, а потом в панике нажал кнопку!.. Амфетамины они такие...
            Ы)
            Ответить
  • wchat_t обычно используется для UTF-16. следовательно, для английских символов, каждый двухбайтный символ будет содержать байт с нулем. соответственно strlen заткнется на первом же символе и вернет 1 или 0 (в зависимости от Big/Little Endian)
    Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8