1. Си / Говнокод #3429

    +136

    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
    16. 16
    17. 17
    18. 18
    19. 19
    #include <stdio.h>
    #include <string.h>
    int reg (char str[])
    {
    	int i;
    	int n=strlen(str);
    	for (i=0; i<n; i++)
    	if (str[i]<91) str[i]=str[i]+32;
    	return str[i];
    }
    int main ()
    {
    	char str[100]="OlololOlolOloLolOlooLololOlOllllOOOloLoloOlO";
    	int a=reg(str);
    	int i,n=strlen(str);
    	reg(str);
    	printf("%s",str);
    	return 0;
    }

    Программа собственно переводит в нижний регистр. Но как-то жестко написана. Очень сокрушаюсь, что нас еще не научили strwlr и strupr в институте. Оправдано такое написание или все же лучше пользоваться библиотечными функциями?

    Запостил: ForEveR, 09 Июня 2010

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

    • strlwr. Перепутал буковки
      Ответить
    • По моему int reg (char str[]) лучше заменить на int reg (char *str).
      Ответить
      • Хм... А в чем разница?
        Ответить
        • Для компилятора - никакой разницы.
          Единственно что могу предположить, массив не обязан заканчиваться нулем и может содержать этот ноль в любом месте.
          Строка же - нуль-терминирована. Так что читающему код проще понять, передается указатель как массив или как строка. И следовательно как в теле функции аргумент будет интерпретирован. В данном же случае (из-за strlen() внутри) нагляднее чтоб было char*.
          Ответить
    • OlololOlolOloLolOlooLololOlOllllOOOloLol oOlO
      Ответить
    • эта функция не binary-safe, но в принципе должно работать. Но strlwr значительно быстрее, естественно
      Ответить
    • написано чистенько,но strlwr работает немного по другому,и быстрее (см сырцы (см линукс))
      Ответить
      • Я переписал через strlwr и через strupr. А в чем отличие в работе?
        Ответить
    • if (str[i]<91) и только? А как эта функция переводит пробелы, цифры и знаки препинания?
      А какое значение она возвращает? Она должна возвращать последний байт строки (то есть ноль), но тип результата int, а не char.
      Порадовали два вызова reg(str) в мэйне. Значит, если бы в строке был пробел, то к его коду прибавится 32, а потом ещё 32.
      Плюсую однозначно!
      Ответить
    • int n=strlen(str);
      for (i=0; i<n; i++)
      Фу.
      while(*str++)
      вот ТРУЪ-сишный стиль.
      Ответить
      • while( *(*(*(*str++))) ) {}
        больше указателей! Это признак того, что Вы - программист скиллованый.
        Ответить
      • +1 Быстрее и короче же.
        Ответить
      • трушный, первый символ у тебя в строке останется не проверенным

        for (; *str; ++str) if (*str >= 'A' && *str <= 'Z') *str += 32;


        если на то пошло
        Ответить
        • Постинкремент работает после сравнения.
          Ответить
          • Кстати, daemon_master прав. Указатель на первый символ уже будет сдвинут. Так что правильное возражение.
            Ответить
          • >Постинкремент работает после сравнения.
            Это да. Но в теле цикла уже будет указывать на второй символ.
            Ответить
          • while (*str++) {} у тебя сравнивается, и потом переходит на следующий адрес памяти, и в теле цикла уже будет на следующем символе в строке
            Ответить
    • показать все, что скрытоа если я тама напишу циверки, они мне тоже переведутся в нижний регистр типа:-D
      Ответить
    • Преобразование > в ^ это ни хуя нижний регистр, а поворот на +½π :-D
      Зато «написано чистенько», ага

      Вердикт: говнокод заплюсовать, автора наградить именной таблицей символов (и по секрету сказать, что в ней еще полно букв, требующих преобразования)

      ЗЫЖ длину имеет смысл сделать параметром, а не вычислять трижды
      Ответить

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