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

    +138.7

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    char serverName[MAX_NAME];
    char buttonName[MAX_NAME];
    char serverIdStr[3];
    serverIdStr[2] = '\0';
    int currentSpot = 0;
    
    // ...... получение serverName и currentSpot
    
    serverIdStr[0] = '0' + ((currentSpot+1)/10);
    serverIdStr[1] = '0' + ((currentSpot+1)%10);
    strcpy(buttonName, buttonPrefix);
    strcat(buttonName, serverIdStr);

    Кто то не знает про существование sprintf...

    Запостил: pushkoff, 20 Января 2010

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

    • Все кто орут, что си сложный или "слишком низкоуровневый" обычно пишут примерно так.
      Ответить
    • Я даже на асме так коряво не выводил:-)
      Ответить
    • Это всё лажа, когда занимался китайскими девайсами там тоже числа от 1 до 16 ввиде строк по rs485 передавались. Приходилось возиться с делением на 10 и остатками.
      И ещё можно так: char serverIdStr[] = "00";
      тогда не нужно:
      serverIdStr[2] = '\0';
      и можно:
      serverIdStr[0] += (currentSpot+1)/10;
      serverIdStr[1] += (currentSpot+1)%10;
      Ответить
    • sprintf опасен (если что-то забыл или перепутал), притом этого можно долго не замечать.
      И намного медленее своих собратьев, выполняющихся за пару операций:
      serverIdStr[0] += (currentSpot+1)/10;
      serverIdStr[1] += (currentSpot+1)%10;
      Хотя, видимо, скорость здесь не важна.
      Ответить
      • где-то в инете есть тест, где sprintf выполняется быстрее копирования строк связкой strcpy+strcat...
        sprintf заносит последовательно обе строки в буфер, что очень радует кеш, и sprintf в большинстве реализаций не считает размер строк...
        в связке strcpy+strcat, вычисление размера строки которая уже есть в буфере (в момент strcat) очень не нравится кешу, хотя это верно только для очень больших строк и маленьких кешей...

        sprintf вообще-то нагляднее...
        Ответить
        • > где-то в инете есть тест, где sprintf выполняется быстрее копирования строк связкой strcpy+strcat
          это implementation-specific
          Ответить
          • да, но если делать хендмейд варианты функций то, sprintf зарулит strcpy+strcat, так как
            sptintf будет больше похож на
            strcpy( &buf[0], string1 );
            strcpy( &buf[length_of_string1], string2 ); где расчет length_of_string1 будет разультатом первого шага
            + разбор %s%s

            а strcpy+strcat будет похожа на
            strcpy( &buf[0], string1 );
            strcpy( &buf[strlen(buf)], string2 );

            можно заметить что разбор %s%s выполняется за константное время, в отличии от функции strlen(), поэтому можно с уверенностью сказать что существуют данные на которых sprintf будет быстрее...

            статью найти не могу, так как встретил больше 2х лет назад...
            Ответить
    • Тут можно и itoa() использовать.
      Ответить

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