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

    +124

    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
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    void UPStr(char *str)
    {
        while (*str)
        {
            switch (*str)
            {
                case 'а': *str = 'А'; break;
                case 'б': *str = 'Б'; break;
                case 'в': *str = 'В'; break;
                case 'г': *str = 'Г'; break;
                case 'д': *str = 'Д'; break;
                case 'е': *str = 'Е'; break;
                case 'ё': *str = 'Ё'; break;
                case 'ж': *str = 'Ж'; break;
                case 'з': *str = 'З'; break;
                case 'и': *str = 'И'; break;
                case 'й': *str = 'Й'; break;
                case 'к': *str = 'К'; break;
                case 'л': *str = 'Л'; break;
                case 'м': *str = 'М'; break;
                case 'н': *str = 'Н'; break;
                case 'о': *str = 'О'; break;
                case 'п': *str = 'П'; break;
                case 'р': *str = 'Р'; break;
                case 'с': *str = 'С'; break;
                case 'т': *str = 'Т'; break;
                case 'у': *str = 'У'; break;
                case 'ф': *str = 'Ф'; break;
                case 'х': *str = 'Х'; break;
                case 'ц': *str = 'Ц'; break;
                case 'ч': *str = 'Ч'; break;
                case 'ш': *str = 'Ш'; break;
                case 'щ': *str = 'Щ'; break;
                case 'ъ': *str = 'Ъ'; break;
                case 'ы': *str = 'Ы'; break;
                case 'ь': *str = 'Ь'; break;
                case 'э': *str = 'Э'; break;
                case 'ю': *str = 'Ю'; break;
                case 'я': *str = 'Я'; break;
    
                case 'a': *str = 'A'; break;
                case 'b': *str = 'B'; break;
                case 'c': *str = 'C'; break;
                case 'd': *str = 'D'; break;
                case 'e': *str = 'E'; break;
                case 'f': *str = 'F'; break;
                case 'g': *str = 'G'; break;
                case 'h': *str = 'H'; break;
                case 'i': *str = 'I'; break;
                case 'j': *str = 'J'; break;
                case 'k': *str = 'K'; break;
                case 'l': *str = 'L'; break;
                case 'm': *str = 'M'; break;
                case 'n': *str = 'N'; break;
                case 'o': *str = 'O'; break;
                case 'p': *str = 'P'; break;
                case 'q': *str = 'Q'; break;
                case 'r': *str = 'R'; break;
                case 's': *str = 'S'; break;
                case 't': *str = 'T'; break;
                case 'u': *str = 'U'; break;
                case 'v': *str = 'V'; break;
                case 'w': *str = 'W'; break;
                case 'x': *str = 'X'; break;
                case 'y': *str = 'Y'; break;
                case 'z': *str = 'Z'; break;
            }
            ++str;
        }
    }

    Запостил: vr8h, 15 Мая 2015

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

    • case '1': *str = 'ОДИН'; break;
      Ответить
    • CharUpper/toupper, не?
      Ответить
      • С toupper беда: по умолчанию она переводит в заглавные только ASCII, т. е. только базовую латиницу. Для перевода букв других алфавитов нужна локализованная версия функции, которая на вход принимает ещё и кодировку.

        Для UTF-8 есть mbctoupper, а для UTF-16/UCS-2 (кто знает точно, для какой из них?) — towupper. Но здесь, как я понимаю, кодировка однобайтная. Значит, либо придётся либо использовать API операционной системы (в Windows уже упомянутую CharUpper, которая в качестве параметра кодировку не принимает, поэтому её результат зависит от локали, установленной у клиента) либо тащить с собой дополнительную библиотеку (iconv или типа того).

        В любом случае даже приведённый код можно было сократить в два раза с помощью toupper.
        Ответить
        • 30-метровую ICU.
          Ответить
          • Которую придётся каждые полгода обновлять, если проект использует преобразование часовых поясов из этой библиотеки.

            P.S. Это замечание к данному коду не относится, просто наболело.
            Ответить
            • > Которую придётся каждые полгода обновлять, если проект использует преобразование часовых поясов из этой библиотеки.

              если у тебя нет кастомеров на каких Фиджи, и если ты не грандиозный педант, то обновлять можно и раз в 2-3 года.

              история виндовых апдейтов:

              https://support.microsoft.com/en-us/kb/2981580 (2014)
              https://support.microsoft.com/en-us/kb/2904266 (2013)
              https://support.microsoft.com/en-us/kb/2779562 (2012)
              https://support.microsoft.com/en-us/kb/2633952 (<--- 2011, последний раз когда в Европе что-то менялось.)
              Ответить
              • А Россия — це не Европа?

                P.S. Не хочу участвовать в политических дебатах, но часовые пояса обсудить нужно.
                Ответить
                • Россия и Турция - это единственные страны, достаточно близкие что бы быть кастомерами, где что-то менялось за после *пять* лет.

                  я не то что бы сильно слежу за темой - может еще чего и пропустил - просто время от времени в виндовые апдейты поглядываю.

                  > но часовые пояса обсудить нужно.

                  меняют часто только те страны для которых это больших проблем не создаёт.

                  большие страны - таже Россия - часто этого делать не будет потому что слишком большой эффект у изменения. и как правило самые подверженые "временным" проблемам системы - это финансовые, т.к. все повально всё ещё в местном времени ведут учёт переводов и платежей.
                  Ответить
                  • > часто этого делать не будет

                    В 2011-м году говорили, что реформа будет последней и больше ничего переводить не будем. Прошло три года и снова реформа.
                    Ответить
        • > либо
          либо не пользоваться С, а пользоваться С++
          Ответить
          • Пробовал, не помогает: http://www.cyberforum.ru/cpp-beginners/thread1305355.html
            Ответить
            • Это же пиздец просто какой то. Не ужто в любимом многими линуксе существуют траблы с выводом в консоль.
              Ответить
              • Да просто нехуй утф-8 побайтово апкейсить.
                Ответить
                • а ну это же понятно. Зря она что ли 2х байтовая.
                  Ответить
                  • > утф-8
                    > 2х байтовая

                    Кажется, сегодня чей-то кругозор должен расшириться...
                    Ответить
            • а если так?
              #include <locale>
              std::locale rus("russia_russia");
              std::locale::global(rus);
              char b = 'б';
              std::toupper(b, rus);
              Ответить
              • К сожалению:
                - в винде и в линухе совершенно разные названия локалей;
                - 'б' не всегда помещается в char;
                - std::toupper() бесполезен для multibyte кодировок.

                Так что без бутылки буста тут не разобраться ;(
                Ответить
                • какие мультибайт кодировки, вы исходный пост читали?

                  - для альтернативных ОС мультибайт надо переводить в вайд, т.к. врядли только апперкейсом ограничится
                  - std::toupper(std::locale) работает в т.ч. и с вайд
                  - перевод utf8<->вайд есть в самом с++11 уже (т.к. слямзили с буста)
                  Ответить
                  • > вайд
                    Правда, даже с вайдом немцы со своим SS соснут. Ну да хрен с ними, всё равно задача ОПа только для русских.

                    > исходный пост читали
                    Не барское это дело, исходные посты читать.
                    Ответить
                    • Немцы со своим SS в любой кодировке сосут, потому что в нижний регистр оно может преобразовываться как ss или как ß, в зависимости от слова. Тут без словаря вообще не преобразуешь.

                      И наоборот, насчёт того, преобразовывать ß в SS или оставить, как есть, единого мнения нет.

                      Кстати, не все редакции журналов признали реформу 1996 года, в результате которой появилось сочетание SSS и пришлось соснуть ещё раз.
                      Ответить
                      • То есть то, что ß однозначно заменили на ss - неверно? Чорт, вот как так можно ухитриться насрать себе в кашу в конце 20 века, когда все связанные с этим компьютерные проблемы уже видны?
                        Ответить
                        • Где однозначно заменили? В Швейцарии?

                          В сраной гермашке, как и раньше, нужен словарь. Только теперь словарь нужно обновить, потому что ß теперь пишется чуть-чуть реже.
                          Ответить
                          • Кстати, зачем ещё SSS? Я понимаю, можно заменить ß на SS для упрощения, но в каком случае требуется три буквы?
                            Ответить
                            • В слове «масштаб», например, и в других многоосновных. Правда, если верить викисловарю, в Германии именно это слово оставили: https://de.wiktionary.org/wiki/Maßstab. НО ЕСЛИ ПИСАТЬ КАПСОМ, ТО ТРЕБУЮТСЯ ТРИ БУКВЫ S ПОДРЯД. А швейцарцы и без капса пишут с тремя одинаковыми буквами подряд.

                              P.S. В названиях улиц есть. Paßstraße после реформы 1996 называется Passstraße.

                              https://commons.wikimedia.org/wiki/File:RechtschreibreformBeiStrassennamen. jpg
                              Ответить
                            • Нашёл ещё один пример:
                              Schlußstrich → Schlussstrich.
                              «Заключительный штрих» от Schluẞ→Schluss — «заключение» и Strich — «черта».
                              Ответить
                              • Кстати, в "Папиных дочках" в какой-то серии искали то ли слово "длинношеее", то ли ещё какое-то.
                                Чему ещё я удивляюсь...
                                Ответить
                              • Oh my...
                                Ответить
                        • > когда все связанные с этим компьютерные проблемы уже видны

                          Когда в ходу была КОИ-7, компьютерные проблемы вызывали даже строчные буквы, ПОЭТОМУ ВСЕ ПИСАЛИ КАПСОМ. И ЭТО НЕ СЧИТАЛОСЬ ЭКСПРЕССИВНО ОКРАШЕННОЙ РЕЧЬЮ. ЗАТО СКОЛЬКО БАЙТ ЭКОНОМИЛОСЬ; ШИФТ ПЕРЕКЛЮЧАЛ С КИРИЛЛИЦЫ НА ЛАТИНИЦУ, А НЕ СО СТРОЧНЫХ НА ЗАГЛАВНЫЕ. КРАСОТА!

                          К чему это я? Компьютерные проблемы — временные. Если в 90-х винчестер на гигабайт был пределом мечтаний, то сейчас у обычного школьника в мобильном телефоне карта памяти больше.

                          *****

                          Средство для розжига: в турецком языке есть буквы İ («и» заглавная с точкой) и ı («и» строчная без точки). Из-за этой мелочи таблица соответствия заглавных строчным не соответствует европейской. Домашнее задание: предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
                          Ответить
                          • > предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
                            Да выпилить к чертям ненужную букву!
                            Вот у украинцев зачем-то три буквы "и" и две буквы "е", если не ошибаюсь. Зачем они? Выпилить, как в русском выпилили лишние буквы.
                            У нас йэщо остались как минимум буквы тсэ, йэ, йо, йу, йа, которыйэ можно спокойно выпилить. Ну или выпилить э, а йэ оставить. Йэщо мошно выпилить букву, на которуйу начинайэтсьа слово "шопа". Тоше не очэнь нушная буква, всьо равно йэйо мошно спутать с буквой "ш", а так искусствьэнная гранитса будьэт размыта.
                            Ответить
                            • иышо нада выпиылиыть букву иы. нахуи. иы эту диэбиыльнуиу галочку на "и" надоиэло пиысать
                              Ответить
                          • Хе-хе. Работал я, в общем, в госструктуре одной, обрабатывали мы правовые акты. И вот таки i латинское и i белорусское (палюсь) - две разные юникод-сущности. А в исходных текстах было то так, то сяк. Ну, нормировали к одной какой-то букве при индексации для поиска.. а вот если еще и латинские термины или формулы какие в документах - наверное индексатор наиндексирует хуйню.
                            Ответить
                            • > палюсь
                              О да, теперь вероятность вычислить Вас возросла с примерно 5.99e-9 до 1.06e-7*.

                              ОЛОЛО ДЕАНОН

                              _____________________
                              * некоторые факторы упущены, реальные вероятности могут быть гораздо выше
                              Ответить
    • У меня сразу встал вопрос про кодировку. А у тебя уже чешется ответ?
      Ответить
      • Любая однобайтовая, в которой есть кириллица. Лишь бы совпадала с кодировкой исходника.
        Ответить
    • Альпийская свежесть
      Ответить
    • Зато кроссплатформенно, и даже для говнокодировок будет работать.
      Ответить
      • К сожалению, только для говнокодировок.
        Ответить



































































































    • Ответить

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