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

    +143

    1. 1
    strlen(s + 5);

    "А чего это оно на 10 символов меньше чем надо возвращает?"

    Запостил: bormand, 18 Марта 2014

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

    • Ну почему только на 10? Там может быть и на 5, и на 20, и на 40... А если s - указатель на структуру, так и вообще на любое число, кратное 5.
      Ответить
      • Компилятор будет ругаться, если там не char *, так что с размером проблем нет :)

        А на 10 символов меньше т.к. имелось в виду strlen(s) + 5. 5 символов не добавилось, да еще и 5 символов отъело с начала - итого 10.
        Ответить
        • Это зависит от возраста компилятора - еще каких-то 20 лет назад активно использовался синтаксис K&R. А там в принципе проверок типов параметров не существовало.
          Ответить
          • > еще каких-то 20 лет назад
            Слава богу мне не довелось с этим работать ;)
            Ответить
            • Через 20 лет люди будут говорить - слава богу я плюсы не застал!
              Я надеюсь....
              Ответить
              • Через 20 лет люди будут говорить - слава богу я ручную работу с памятью не застал! А плюсы или минусы- то херня.

















































                Ответить
                • Ну нахера столько энтеров?
                  Ответить
                  • Чтоб ты спросил.
                    Ответить
                  • Его конь покусал. За анус
                    Ответить
                  • Залипает. Ну и мнение лиспоговна тоже имеет право на сушествование.
                    Ответить
                    • > Залипает.
                      Хуёвая отмазка, мог бы взять и удалить, не guest же ;)

                      > Ну и мнение лиспоговна тоже имеет право на сушествование.
                      Ну вот это ближе к истине.
                      Ответить
                      • > мог бы взять и удалить,
                        так жеж `4 часа назад`
                        Ответить
                      • Можно, но зачем?
                        Ответить
                        • > Можно, но зачем?
                          Ну чтобы этой белой полосы не было...
                          Ответить
                          • >Ну чтобы этой белой полосы не было...
                            проклятые белолентполосочники...
                            Ответить
                • > ручную работу с памятью и другими ресурсами

                  то есть жаба и шарпик сдохнут, а кресты останутся (но с глубоко забаненными сырыми указателями)?
                  Ответить
                  • >кресты
                    >забаненными сырыми указателями
                    Только не в крестах, ведь это может сломать обратную совместимость с С.
                    Ответить
                  • В крестах если забанить сырые указатели - это уже не кресты будут.
                    Ответить
                    • Да их и так почти не юзают. Только в совсем низкоуровневых классах.
                      Ответить
                      • Только в низкоуровневых классах и долбоёбы.

                        (в смысле "или")
                        Ответить
                        • Школьнки еще.


                          Рядом с `system("pause");` всегда пасётся пара-тройка `new`, причем без `delete
                          Ответить
                  • Останутся только ФЯ и программирование станет элитарным (ах мечты, мечты...)
                    Ответить
                    • > станет элитарным
                      Снова станет элитарным.
                      Ответить
                      • Это как возвращение на родину....
                        Ответить
                        • > возвращение на родину
                          Кстати, с возвращением!

                          P.S. Таки взяли на работу?
                          Ответить
                          • Вкратце - все перевернулось и не раз. Сейчас учусь на двух факультетах)
                            Ответить
                            • Многовато как-то, многим и одного хватает. Ну, удачи!
                              Ответить
                    • Лалка, что в функциональном программировании элитарного? Обычная питушня для ниасиливших импепративный код. Оно ещё и алгоритмическую сложность алгоритмов ухудшает из-за неизменяемых структур.
                      Ответить
                      • >для ниасиливших импепративный код.
                        Толстовато.
                        Ответить
              • ну как говорят?
                Ответить
        • > Компилятор будет ругаться, если там не char *, так что с размером проблем нет :)
          Толсто.
          #include <stdio.h>
          
          struct KoBo
          {
          	char a;
          	char b;
          };
          
          struct KoBo s[]={'K','o','K','o','K','o','B','o','r','m','o','n','d','o','s',0};
          
          int main(void) {
          	printf("%d", strlen(s+5));
          	return 0;
          }

          http://ideone.com/2WEMUP
          Ответить
          • Ну если ворнинги не читать - прокатит.
            Ответить
            • Лалка, по ссылке пройдись, какие варнинги?
              Ответить
              • Лалка, чё мне твоя ссылка? ideone же не показывает ворнинги если ошибок нет. Компиль нормальным жцц с нормальным уровнем ворнингов:
                1.c:9:8: warning: missing braces around initializer [-Wmissing-braces]
                 struct KoBo s[]={'K','o','K','o','K','o','B','o','r','m','o','n','d','o','s',0};
                        ^
                1.c:9:8: warning: (near initialization for ‘s[0]’) [-Wmissing-braces]
                1.c: In function ‘main’:
                1.c:12:1: warning: implicit declaration of function ‘strlen’ [-Wimplicit-function-declaration]
                 printf("%d", strlen(s+5));
                 ^
                1.c:12:14: warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]
                 printf("%d", strlen(s+5));
                              ^
                1.c:12:1: warning: passing argument 1 of ‘strlen’ from incompatible pointer type [enabled by default]
                 printf("%d", strlen(s+5));
                 ^
                1.c:12:1: note: expected ‘const char *’ but argument is of type ‘struct KoBo *’
                Ответить
                • Что для Си — ворнинг, то для Паскаля — еррор.

                  Пытался воспроизвести в Delphi, но «плюс» не работает с указателями, Succ тоже, Inc не является функцией... Уже думал, что без явного приведения типов никак, но меня спасло ключевое слово оверлорд overload:
                  {$APPTYPE CONSOLE}
                  uses SysUtils;
                  function Add(const x: Integer; i: Integer): Integer; overload;
                    begin
                      Result := x + i
                    end;
                  
                  function Add(const x: PChar; i: Integer): PChar; overload;
                    var
                      x1: Integer absolute x;
                    begin
                      Integer(Result) := x1 + i
                    end;
                  
                  
                  const s: PChar = 'KoKoKoBormondos';
                  begin
                    Writeln (StrLen(Add(s, 5)))
                  end.
                  http://ideone.com/owxADn
                  Ответить
                  • показать все, что скрыто{$APPTYPE CONSOLE}
                    В спойлер, батенька мой, в спойлер!..
                    Ответить
                    • Всё-таки я сделал это! По просьбе Стертора первую строку не показываю:
                      {$MODE OBJFPC}
                      uses SysUtils;
                      
                      type
                        MyPChar = record 
                          value: PChar; 
                        end;
                      
                      operator + (const s: MyPChar; const i: Integer) r: PChar;
                        begin
                          r := PChar(Integer(s) + i)
                        end;
                      
                      const 
                        s: MyPChar = (value: 'KoKoKoBormondos');
                      
                      begin
                        Writeln (StrLen(s + 5))
                      end.
                      http://ideone.com/eliWPS
                      Ответить
                    • Какой багет.
                      Ответить
                  • к пчарам и так можно прибавлять числа, хак с абсолютом не нужен
                    Ответить
                    • Покажите рабочий пример.
                      Ответить
                      • Поговорю сам с собой. Я ломился в открытую дверь. И правда работает. Меня с толку сбил guest, сообщивший, что в Паскале такой проблемы нет.
                        Ответить
                        • Проблемы нет потому что там есть функция length, работающая со строками. Pchar я использовал только чтобы для работы с API, а зачем может понадобиться strlen вообще не представляю.
                          Ответить
                          • Мне вообще PChar не нравится, потому что это грабли. В паскалевских строках и размер всегда известен, поэтому его не нужно вычислять, и хранить можно любые двоичные данные... и проблемы с плюсиком нет.
                            Ответить
                            • Ололо. Грабли, это когда юзают pchar как простую строковую переменную, хотя на самом деле это указатель.


                              О, как тонко, мьсе, какой такт!..
                              http://fc05.deviantart.net/fs71/f/2011/191/f/e/hyper_trollface_by_darkhaunter-d3ll1hv.gif
                              Ответить
                      • А зачем, позвольте спросить, совершать арифметические операции с указателями? Это же портит их значение.
                        Ответить
                        • Это бывает очень нужно, когда апи возвращает количество элементов в массива и указатель на первый элемент.
                          Ответить
                          • А-а-а, теперь я понял. Спасибо за инфу.
                            Ответить
                          • В Паскале арифметические операции с указателями не нужны, потому что кастануть в массив не составляет труда. Нет, для примера с относительными указателями, которые возвращает АПИ, всё-таки нужны.
                            Ответить
                            • Дааа, кастануть в массив.
                              Вот в такой, да?

                              type
                                PMonster        = ^Monster;
                                PAPMonster      = ^APMonster;
                              
                                PItem           = ^Item;
                                PAPItem         = ^APItem;
                              
                                PSPoint         = ^SPoint;
                                PAPoint         = ^APoint;
                                PPoint          = ^Point;
                                PAPPoint        = ^APPoint;
                              
                                PSector         = ^Sector;     
                                PAPSector       = ^APSector;
                              
                                PAFace          = ^AFace;
                                PFace           = ^Face;
                                PAPFace         = ^APFace;
                              
                                PConvexInSector = ^ConvexInSector;
                              
                                PConvex         = ^Convex;    
                                PAConvex        = ^AConvex;
                                PAPConvex       = ^APConvex;
                              
                                PAInt           = ^AInt;
                                PTexture        = ^Texture;
                                PItemPoint      = ^ItemPoint;
                                PAItemPoint     = ^AItemPoint;
                                PItemModel      = ^ItemModel;
                              
                                PBullet         = ^Bullet;
                                PWeapon         = ^Weapon;
                              
                              
                                AInt = array [0 .. MaxInt div sizeof(integer)-1] of integer;
                              
                                APoint = array [0 .. MaxInt div sizeof(Point)-1] of Point;
                                APPoint = array [0 .. MaxInt div sizeof(PPoint)-1] of PPoint;
                              
                                AFace = array [0 .. MaxInt div sizeof(Face)-1] of Face;
                                APFace = array [0 .. MaxInt div sizeof(PFace)-1] of PFace;
                              
                                APSector = array [0 .. MaxInt div sizeof(PSector)-1] of PSector;
                              
                                AConvex = array [0..MaxInt div sizeof(Convex)-1] of Convex;
                                APConvex = array [0 .. MaxInt div sizeof(PConvex)-1] of PConvex;
                              
                              
                                AItemPoint = array [0..MaxInt div sizeof(ItemPoint)-1] of ItemPoint;
                              
                              
                                APItem = array [0..MaxInt div sizeof(PItem)-1] of PItem;
                              
                              
                                APMonster = array [0..MaxInt div sizeof(PMonster)-1] of PMonster;
                              Ответить
                              • Прощай, проверка корректности индекса.
                                Ответить
                              • так вот откуда в дотнетные плюсы значок указателя пришел
                                Ответить
    • показать все, что скрытоВся `мощь` адресной арифметики.
      Ответить
    • показать все, что скрытоКстати в паскале довольно часто пишу по ошибке +N\-N не с той стороны скобок. Какое счастье, что там этой проблемы нет.
      Ответить
      • показать все, что скрытоКакое счастье, что тебя нет в сях.
        Ответить
      • показать все, что скрытоТы был мне как брат, я тебя плюсовал, а оказалось, что в Паскале такая же проблема со строками, завершающимися нулём, как и в Сишке...

        В наказание лови работающий пример со стрингом, возвращающий ожидаемое значение length:
        {$MODE OBJFPC}
        type
          MyString = record 
            value: string; 
          end;
          
        operator + (const s: MyString; i: Integer) r: string;
          var 
            tmp: string;
          begin
            tmp := '';
            repeat
              tmp := tmp + chr(random(255)); // add some chars just to return expected length
              dec(i)
            until i = 0;
            r := s.value + tmp
          end;
        
        const 
          s: MyString = (value: 'KoKoKoBormondos');
        begin
          Writeln (Length(s + 5))
        end.
        http://ideone.com/8o5Qtx

        Спойлер для Стертора: (И да, здесь я тоже подразумеваю консоль.).
        Ответить
        • показать все, что скрытоСпасибо тебе, дорогой товарищ! Я ценю и уважаю тебя.
          Ответить
        • показать все, что скрыто
          operator + (const s: MyString; i: Integer) r: string;

          хм, с (r: string) забавный синтаксис, правда применения не могу придумать - чисто чтобы сэкономить пару букв на Result? Или для каких-нибудь режимов макопаскаля, где Result запрещен?
          Ответить
        • фу икарус, на кой хер ты стертора привечал?
          Ответить
          • 10 лет ago все привечали Стертора. Никто ещё не знал, что он таким пидором окажется.
            Ответить
    • показать все, что скрытоМы делаем это ночью и днем,
      Ты моя любовь.
      Мы делаем это вновь и вновь,
      Словно другого раза не будет.
      Ответить
    • def email_normalize(mail: str) -> str:
          return mail.strip().replace("/", ".") if "@" in mail else ""
      
      
      
      def phone_normalize(phone: str) -> str:
          phone = "".join(x for x in phone if x.isdecimal())
          if phone:
              if len(phone) > 11:
                  return ""
              elif 6 <= len(phone) < 10:
                  return phone
              elif len(phone) == 10:
                  if phone.startswith("9"):
                      return f"7{phone}"
                  else:
                      return phone
              elif len(phone) == 11:
                  if phone.startswith("8") and phone[1] == "9":
                      return f"7{phone[1:]}"
                  elif phone.startswith("7"):
                      return phone
                  else:
                      return ""
              return ""
          return ""


      кто ему скажет?
      https://habr.com/ru/articles/793486/
      Ответить
    • According to the Online Historical Encyclopaedia of Programming Languages, people have created about 8,945 coding languages.

      дебилы блядь
      Ответить

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