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

    +146

    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
    int main(argc,argv)
    int argc;
    char *argv[];
    {
    int raw=0,httpcont=0;
    int i,ilatex=0,ititle=1;
    char *spoint=0;
    char ttver[]=TTH_VERSION;
    char ttname[20];
    ...
        strcpy(ttname,"Tt");
        strcat(ttname,TTH_NAME);
        strncpy(spoint-10-strlen(ttname),ttname,strlen(ttname));

    Понадобился мне конвертёр TeX в HTML.
    Скачал (http://hutchinson.belmont.ma.us/tth/), всё работает, но оказалось, что он не умеет работать с командой \begin{cases}
    Ну я решил его подправить, благо исходник открыт.
    Открыл я исходник и... решил написать с нуля свой.

    ПС Посоны, что делает 13я строчка?
    ППС Си - говно.

    Запостил: TarasB, 31 Мая 2011

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

    • >что делает 13я строчка?
      копирует не более strlen(ttname) символов из ttname в (spoint-10-strlen(ttname)).
      Т.е в данном случае не копируется завершающий ноль.
      Для того, чтобы понять первый аргумент - не помешает развернуть 10ю строку многоточий.
      Ответить
    • > Посоны, что делает 13я строчка?
      #ifdef TTH_GOLD
      #define TTH_NAME "Hgold"
      #else
      #define TTH_NAME "H"
      #endif
      ...
      char tth_DOC[]="\n\
                      Version XXXX (c)1997-2010 Ian Hutchinson\n\
      ...
      if((spoint=strstr(tth_DOC,"XXXX"))){ /* Make version strings */
      ...

      Способ создания строки с инфо о версии.

      printf(spoint);
      уже наконец.
      Ответить
      • Конечно же, printf("%s",spoint); , если printf() не своя.
        Ответить
      • Блин, не приметил.
        Получилась загадка в стиле Урсуса.
        Ответить
    • Чет не понял
      spoint-10-strlen(ttname)
      Адрес первого символа spoint - 10 - длина строки ttname O_o
      Ответить
    • Аффтар - гавно.
      Си - рулит.
      Ответить
    • Минус один Тарасу за последний постскриптум.
      Ответить
    • За одно только использование 'strncpy' для "ограниченного копирования" - расстрел на месте.
      Ответить
      • Чем плох strncpy? Кроме некопирования нуля в отдельных случаях конечно.
        Ответить
        • 'strncpy' плох тем, что для таких целей совершенно не предназначен.

          Назначение функции 'strncpy' - конвертирование нуль-терминированных строк (т.е. обычных С-шных строк) в строки "фиксированной ширины" (которые не обязательно нуль-терминированы). Строки фиксированной ширины использовались в файловой системе одной из старинных версий Юникса (System V). Там имя файла представлялось строкой фиксированной ширины в 14 символов. Вот специально для этого и была заведена функция 'strncpy'. Никакого отношения к ограниченному копированию нуль-терминированных строк эта функция не имеет (немотря на сбивающее с толку имя). К сожалению, функции ограниченного копирования нуль-терминированных строк в стандартной библиотеке С вообще нет.

          Многие реализации однако предоставляют функцию ограниченного копирования нуль-терминированных строк по имени 'strlcpy'. Это фактически стало де-факто стандартом для имени этой функции. Т.е. пользоваться в таких случаях надо именно 'strlcpy'. Если ваша реализация такой функции не предоставляет - напишите ее сами. А пользоваться для этих целей 'strncpy' - это забивание шурупов молотком. К сожалению, многие источники тупо втирают новичкам байки о том, что 'strncpy' - это якобы "функция безопасного копирования нуль-терминированных строк в С", что является банальным враньем. А потом начинается это кривое использование 'strncpy' для "безопасного копирования"...
          Ответить
    • показать все, что скрытоvanished
      Ответить

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