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

    +4

    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
    20. 20
    21. 21
    void delslovo(char *a)
    {
        static int i = 0;
        static bool j = false;
        if (a[i++] != '\0')     delslovo(a);
        else i--;
        if (!j)
        {
            if (a[i] != ' '&&a[i] != '\n'&&a[i] != '\0')
            {
                j = true;
                i++;
            }
        }
        if (j)
        {
            if (a[i - 1] == ' ') return;
            a[i - 1] = a[i];
        }
        i--;
    }

    вот так надо удалять последнее слово из строки

    Запостил: beckon, 22 Июля 2016

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

    • предлагаю оформить в библиотеку и прдават
      Ответить
    • > static bool j = false
      Оно на второй раз вообще работает?
      Ответить
      • нет. Один раз создаст буль инициализировав его false, потом сбрасывать в false не будет
        Ответить
        • Одноразовые функции. Новое веяние в программировании.
          Ответить
          • очень удобно например, буферизовать промежуточные вычисления в static переменной и не пересчитывать их постоянно если тяжелая функция часто вызывается с одинаковыми аргументами
            Ответить
            • как ты вертись и не отмазывайся - static переменные внутри функции это 100% говно.

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

                  я первый раз с TLS грабли видел как раз как чудаки в одной либе только начали пользоватся TLS, и обнаружили крутой эффект что значения пропадают. (в тесте работало на ура - в продакшене вообще ни разу.) выяснилось что работа идет через тред пул, и в каком именно потоке что/когда вызовется просто не известно. повезло что этих идиотов один архитект перехватил и TLS в текущем релизе запретил - потому что они уже начали тред пул расхуячивать, что бы для одной сессии только один поток использовался. "патаму что эта тред пул винават что наша ТэЛэСэ не работает!"
                  Ответить
                  • Я никуа не понял.
                    Ответить
                    • тлс как "решение" для статиков работает только если у тебя все вызовы этой функции - принадлежащие к одной транзакции - делаются из одного потока. если у тебя действия внутри транзакции параллелизируются с помощью пула - что и не так экзотично - то тлс все ломает, и в худшем случае личит ресурсы.
                      Ответить
                  • Свой кэш каждому потоку может быть оправдан из-за отсутствия необходимости синхронизации. С тредпулом это ещё лучше работает, так как кеш не сдыхает после каждого таска. С умом нужно подходить, короче. И с профайлером.
                    Ответить
          • ... а кое-где даже мьютексы можно в статики засовывать. Вообще красотища
            Ответить
            • мьютекс в статике это классика для нереентерабельных функций (например, если кто-то сохранил результаты вычислений в статике и не хочет чтобы они внезапно поменялись)
              Ответить
          • Триальная версия.
            Ответить
            • Можно в качестве ключа взять версию компилятора с флагами и ОС. При указанных условиях у покупателя соберётся функция, которая за счёт UB, памятных хаков и такой-то матери умеет сбрасывать свою статическую питущню.
              Ответить
    • > if (a[i++] != '\0') delslovo(a);

      пятница, жара, хочу пива - сдался. как это вообще должно работать? у меня мозги из этой рекурсии не выходят.
      Ответить
      • входит в рекурсию пока не встретит \0
        далее на выходе из рекурсии пропускает пробелы и двигается в обратную сторону, встречает символ и на его место записывает пробел справа, это выполняется пока не встретится пробел(=> слово удалено)
        много воды утекло с того момента когда писал это на первом курсе. помнится ушло на этот говнокод 15минут. задание было: реализовать функцию удаляющую последнее слово, в функцию передается лишь строка. другие функции использовать нельзя и желательно сделать это рекурсией (тк препод любил когда что-то делают рекурсивно)
        препод сам завис когда этот говнокод с листика компилировал, поспорил с ним что оно работает - набрал на пека, запустил - выдало нужный результат. естественно только при первом использовании функции
        Ответить

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