Программирование на Си. #17. Строки. Часть 1.

Sdílet
Vložit
  • čas přidán 23. 07. 2016
  • В этом уроке:
    1. Особенности строк.
    2. Ключевое слово const.
    3. Cтроки и указатели.
    4. Аргументы в main.
    Github: github.com/GenaANTG/C/tree/ma...
    Мы запустили сайт и записали новый курс!
    Более 120 уроков по языку Си!
    Детали на antg.pro
    🚀 Подписывайся на мой канал в Telegram: @antg_official
    🚀 И заходи на сайт: antg.pro!
    #genaantg
    #программирование
    #языкси
    #урокиси
    #старыйкурс
    #старыеуроки

Komentáře • 130

  • @ANTGPRO
    @ANTGPRO  Před 3 lety +1

    🚀 Подписывайся на мой канал в Telegram: @antg_official
    🚀 И заходи на сайт: antg.pro!

  • @mkh163
    @mkh163 Před 8 lety +4

    Шикарно! Спасибо большое! Рад что новые выпуски пошли!

  • @volodymyrgutsu7011
    @volodymyrgutsu7011 Před 7 lety +4

    Отличные уроки! идут как дети в школу)) Спасибо, Гена)

  • @avantura5609
    @avantura5609 Před 7 lety +9

    Вот тут нормально разогнался. Реально интересно. С меня лайк и подписка.

  • @SteamVin
    @SteamVin Před 8 lety +10

    Вуху! Дико радуешь последнее время) огроменное спасибо!)

    • @ANTGPRO
      @ANTGPRO  Před 8 lety +1

      Пожалуйста ))

  • @bishop_ru6767
    @bishop_ru6767 Před 4 lety

    Благодарю за урок! Нашел все, что искал!

  • @AlexandrSamoylov
    @AlexandrSamoylov Před 8 lety +4

    я глазам своим не верю ... так регулярно видео выходят просто супер ))

    • @ANTGPRO
      @ANTGPRO  Před 8 lety +3

      Стараюсь ))

  • @amoriblain3655
    @amoriblain3655 Před 4 lety

    Хорошо и понятно объяснил)

  • @user-fn8zn1fy8x
    @user-fn8zn1fy8x Před 7 lety +5

    Отличная подача материала

  • @bibigulotepbergenova3814

    спасибо огромное!

  • @Demand77
    @Demand77 Před 8 lety +1

    очень рад тебя видеть)

  • @user-vx5yy8md2p
    @user-vx5yy8md2p Před 8 lety

    Вы нас балуете.))))

  • @alexdelux2870
    @alexdelux2870 Před 7 lety

    Гендос норм урок!

  • @shoostr
    @shoostr Před 7 lety

    А можно ли создавать и использовать многомерные массивы состоящие из разных типов элементов, например текста и чисел?
    И еще можно ли по аналогии с PHP создавать и использовать ассоциативные массивы, где ключом было бы число а значением текст?

  • @rajahbtw
    @rajahbtw Před 3 lety +2

    переменная локальная, это значит, что она передается через стековый фрейм, то бишь там будет мусор. Если бы была глобальная неинициализированная переменная, то там были бы нули, тк проц такие переменные заносит в сегмент .bss, который при запуске программы полностью зануляется (к слову о самостоятельной задаче в начале)

  • @form33649
    @form33649 Před 8 lety

    Помню начинал изучать программирования два года назад на твоих уроках, теперь уже знаю 4 языка программирования.

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Смотря как знаешь ) спецов я вижу редко.

    • @cyborgcobra9997
      @cyborgcobra9997 Před 8 lety +2

      Понты дороже денег)

  • @astronom1579
    @astronom1579 Před 5 měsíci +1

    Почему это видео попалось мне в рекомендации, уже когда я получил зачёт по программированию?

  • @stalkerybr
    @stalkerybr Před 7 lety

    Можно как-то изменить адрес массива или переменной в С++? При операции hello3 = hello4; меняется только значение

  • @antonzhuikov9532
    @antonzhuikov9532 Před 8 lety +1

    Гена, спасибо за новые видео, надеюсь это не просто наваждение какое то а именно работает идея и новые виде так и будут выходить, скоро ооп будет?

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Сначала продвинутый курс а там и ООП.

  • @user-pf6gm7lw1v
    @user-pf6gm7lw1v Před 7 lety

    Привет, мне задали задание в котором нужно вывести график на екран, хочу выполнить его на С99, но так как в консоли это сделать невозможно, какую среду разработки можете посоветовать?

  • @sergeystal15
    @sergeystal15 Před 7 lety

    спасибо за урок =) все что я понял)
    int main(void)
    {
    const char* sity[3] = { "Ubuntu", "Mark Shuttleworth", "Fri-Steyt"};
    char alfa[3] = { 'a', 'b', 'c' };
    printf("
    .%c%p - %s
    ", alfa[0], &sity[0], sity[0]);
    printf("
    .%c%p - %s
    ", alfa[1], &sity[1], sity[1]);
    printf("
    .%c%p - %s
    ", alfa[2], &sity[2], sity[2]);
    printf("-------------------------------------------
    ");
    return 0;
    }

  • @sevan8455
    @sevan8455 Před 3 lety +1

    Вы меня выручили!!! Спасибо!!! Можно я вам задоначу? Я страдал 3 часа и не мог в *имя строке изменить символы, посмотрел ваше видео, все понял, все получилось! Спасибо вам огромнейшее!!! Киньте ссылку для доната!

    • @ANTGPRO
      @ANTGPRO  Před 3 lety +1

      Донатов нет, но можете купить новый курс на antg.pro

  • @ilanpervil8906
    @ilanpervil8906 Před 7 lety +8

    Гена честно, до этого урока объяснял все супер, повторял много и все было ясно. Тут же все очень быстро, нечего не понятно хоть уже 100 раз его пересмотрел и 90% написанного кода у меня вообще не работает... (((

    • @ANTGPRO
      @ANTGPRO  Před 7 lety +2

      Компилируй с флагом --std=c99
      На практических примерах разберемся лучше, не волнуйся, это пример реальной программы.

  • @amoriblain3655
    @amoriblain3655 Před 4 lety +2

    Как в "const char* states[]= {"Moscow","New-York"}" посчитать кол-во символов допустим в "Moscow"?

    • @ANTGPRO
      @ANTGPRO  Před 4 lety +1

      Обратиться по индексу массива и использовать strlen: size_t length = strlen(states[0]);

  • @grekdz7782
    @grekdz7782 Před 7 lety +1

    Приветствую. А видео об "if... else" "switch, case" есть ?

    • @ANTGPRO
      @ANTGPRO  Před 7 lety +1

      кстати нет) Запишу!

    • @grekdz7782
      @grekdz7782 Před 7 lety +1

      Gena ANTG Благодарю =)

  • @user-kc5ms3vr1c
    @user-kc5ms3vr1c Před 8 lety +1

    ура видос) что ты думаешь о книге по си керигана и ритчи?

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      краткий ввод в Си и его демонстрация, как учебник не очень.

    • @user-kc5ms3vr1c
      @user-kc5ms3vr1c Před 8 lety +1

      +Gena ANTG спасибо ти за быстрый ответ)

    • @tigrpoehal1836
      @tigrpoehal1836 Před 8 lety +1

      Как сказал товарищ капитан из "Зеленого слоника" : "Это классика, это знать надо!".

  • @xelnagamex
    @xelnagamex Před 7 lety +1

    Stack overflow это не только форум, но ещё и переполнение стека. FYI - ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D0%B5%D0%BA%D0%B0

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      Ничего себе.
      Если что, я об этом говорил в первых уроках. Йо.

    • @xelnagamex
      @xelnagamex Před 7 lety +1

      Ок.

  • @alexeis628
    @alexeis628 Před 3 měsíci

    за const char * const hello4 лайк!😎

  • @valentinesknaryov9805
    @valentinesknaryov9805 Před 7 lety +4

    А где вторая часть? Скоро год уже, как блокбастеры в Голливуде прям

  • @yurach3598
    @yurach3598 Před 7 lety

    Помогите пожалуста, а как в саблайме компилировать и запускать cpp файл( на С++), подскажите что делать?

    • @Stransh
      @Stransh Před 7 lety

      компилировать - tools -> build system | build

  • @user-if5xn4qq4q
    @user-if5xn4qq4q Před 7 lety +1

    путаюсь с тем где какие маркеры юзать, как бы от этого избавиться

  • @antonzhuikov9532
    @antonzhuikov9532 Před 8 lety

    И ещё, делай в описании пожалуйста вставку с временем откуда начинается та или иная тема.

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Ооо) Это пока не обещаю )) мне бы видео записать, и так времени мало )

    • @antonzhuikov9532
      @antonzhuikov9532 Před 8 lety +1

      Ну в таком случае лучше видосики:)

  • @user-gl6mu5zd8p
    @user-gl6mu5zd8p Před 7 lety

    Привет Гена! У меня такой вопрос: квадратная матрица целых чисел типа short передается в функцию аналогично массиву строк?

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      да, только с типом short. Я еще запишу видео по массивам.

    • @user-gl6mu5zd8p
      @user-gl6mu5zd8p Před 7 lety

      Не могу понять почему компилятор выдает ошибку
      #include
      void VyvodDannyh (short **array)
      {
      // Вывод данных на экран
      printf("
      ","Elementy matricy");
      for (char i=0;i

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      Ирина Ковалева а ошибка какая? в данном случае лучше использовать форму записи: short array[][] и передавать в функцию кол-во строк и колонок в массиве, 3 аргумента

    • @user-gl6mu5zd8p
      @user-gl6mu5zd8p Před 7 lety

      Все получилось! Только я не совсем поняла почему((( Вы же вроде говорили, что **array это то же самое, что *array[] и соответственно array[][] . В чем разница?

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      Ирина Ковалева нужно видеть вашу ошибку

  • @user-xr1ny1kt3h
    @user-xr1ny1kt3h Před 8 lety

    Приветствую, какая у тебя тема в ubuntu

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Привет!
      Arc Theme: github.com/horst3180/arc-theme
      Numix icons: www.ubuntumaniac.com/2016/04/install-numix-circle-icon-theme-on.html
      Sublime Theme: github.com/equinusocio/material-theme

  • @oisiaspoisias9412
    @oisiaspoisias9412 Před 7 lety

    я вот чего не понял .
    Вроде типа , например , char* name = &name; мы использовали для адреса и присвоение переменной значение адреса
    тип char *name использовали для вывода значения , указаном в адресе
    а что такое char * name ?

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      нужно еще раз смотреть, char * name - указатель, *name - читаем значение по адресу указателя

  • @darthrevan7976
    @darthrevan7976 Před 7 lety

    Здравствуйте. Помогите, пожалуйста, разобраться. Решил поиграться со строками, и вот какая неувязка:
    Пытаюсь передать в функцию массив строк следующим образом
    #include
    //передаем в функцию массив строк и размер массива
    //если пытаться вычислить размер внутри самой функции - не компилируется
    void printTempStr(char *string[], int size){
    //выводим значения переданного массива
    for(int i = 0; i < size; i++){
    printf("
    %s", *(string + i));
    }
    //до этого момента все отрабатывает нормально
    //декларируем временный массив строк - (далее X - это разные варианты)
    char * tmp_string[X] = {};
    //присваиваем временному массиву значения переданного массива
    for(int i = 0; i < Х; i++){
    *(tmp_string + i) = *(string + i);
    }
    printf("
    ---------------------------
    "); //разделитель
    //выводим значения временного массива
    for(int i = 0; i < Х; i++){
    printf("
    %s", *(tmp_string + i));
    }
    return;
    }
    int main (void){
    char * word[] = {"String1", "Str2"};
    int wordSize = sizeof(word)/sizeof(int);
    printTempStr(word, wordSize);
    return 0;
    }
    Так вот, если вместо Х я ставлю просто 2 - все срабатывает(компилируется, присваивается, выводит).
    если вместо Х ставлю переданный в функцию размер исходного массива size - не компилируется и выводит вот это:
    strings.c: In function 'printTempStr':
    strings.c:15:2: error: variable-sized object may not be initialized
    char * tmp_string[size] = {};
    - но там же тоже двойка, это можно проверить выведя size через printf в консоль.
    Если не ставлю вместо Х ничего - вроде компилируется, но при запуске выдает ошибку и принудительно закрывает программу
    Что здесь не так?
    Занимаюсь на Windows 10, gcc.
    компилирую: gcc strings.c -o strings.exe -std=c99
    З.Ы: и почему нельзя вычислить размер массива внутри функции?

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      С этой темой мы детально разберемся в новом курсе.
      Объяснять нужно будет на примерах.

  • @user-df3uv8dy7q
    @user-df3uv8dy7q Před 4 lety +1

    Народ, а как в строке заменить например httht//tttt/qqqqq чтобы выводило httht//-spam-/qqqqq

    • @ANTGPRO
      @ANTGPRO  Před 4 lety

      Это долго объяснять)) конкретно на Си это не так просто как с более новыми языками)

  • @papin_lab
    @papin_lab Před 8 lety

    Отличная тема и очень сложная. После всяких ждав, питонов и прочего - очень не простая тема. И инфу сходу найти очень сложно.

  • @MalenkayaPlomba
    @MalenkayaPlomba Před rokem

    Ребят, поправьте если я не прав. Я правильно понял, что в случае на 19:15 после выполнения кода hello3 = hello4, т.е. переменная hello3 стала хранить адрес "Hello4", мы фактически потеряли адрес, где хранилась строка "Hello3"?! И тогда возникает вопрос, если моя мысль конечно верна, можно ли каким-то образом найти строку "Hello3" и как это сделать, если единственный способ как мы могли к ней обратиться - это через указатель hello3 до его переприсваивания.🤔🤔

  • @kot_v_noskaxby4378
    @kot_v_noskaxby4378 Před 2 lety

    пожалуйста, можно больше повторений, так и не смог понять что делает const

  • @777espiu
    @777espiu Před 7 lety

    Здравствуйте Геннадий!Такая таблица сойдет?Можно было и по другому в принципе сделать,но мне так удобнее было
    #include
    #define SIZE 8int main (void)
    {
    const char * moscow = "Moscow";
    const char * newyork = "New-York";
    const char * london = "London";
    const char * minsk = "minsk";
    const char * kiev = "Kiev";
    const char * berlin = "Berlin";
    const char * tokyo = "Tokyo";
    const char * hongkong= "Hong-Kong"; float numcitys[SIZE] = {11920000.0,8406000.0,8670000.0,1893000.0,
    2804000.0,3502000.0,13620000.0,7188000.0};
    printf("%-10s = %.0f People.
    ",moscow,numcitys[0] );
    printf("%-10s = %.0f People.
    ",newyork,numcitys[1] );
    printf("%-10s = %.0f People.
    ",london,numcitys[2] );
    printf("%-10s = %.0f People.
    ",minsk,numcitys[3] );
    printf("%-10s = %.0f People.
    ",kiev,numcitys[4] );
    printf("%-10s = %.0f People.
    ",berlin,numcitys[5] );
    printf("%-10s = %.0f People.
    ",tokyo,numcitys[6] );
    printf("%-10s = %.0f People.
    ",hongkong,numcitys[7] ); printf("
    ===========================
    ");
    printf("
    IN DESCENDING ORDER:

    "); printf("%-10s = %.0f People.
    ",tokyo,numcitys[6] );
    printf("%-10s = %.0f People.
    ",moscow,numcitys[0] );
    printf("%-10s = %.0f People.
    ",london,numcitys[2] );
    printf("%-10s = %.0f People.
    ",newyork,numcitys[1] );
    printf("%-10s = %.0f People.
    ",hongkong,numcitys[7] );
    printf("%-10s = %.0f People.
    ",berlin,numcitys[5] );
    printf("%-10s = %.0f People.
    ",kiev,numcitys[4] );
    printf("%-10s = %.0f People.
    ",minsk,numcitys[3] ); return 0;
    }

  • @denyshriaznov786
    @denyshriaznov786 Před 7 lety +1

    строкУ, а не стрОку, а так молодец)

  • @aleksandrnovikov1578
    @aleksandrnovikov1578 Před 7 lety +1

    Если массив это указатель, то почему тогда:
    char *s1 = "Это строка";
    char s2[] = "Это строка";
    //Компилируется и работает
    while (*s1 != '\0')
    {
    printf("%c", *s1);
    s1++;
    }
    //Не компилируется и не работает
    while (*s2 != '\0')
    {
    printf("%c", *s2);
    s2++;//компилятор ругается на эту строку
    }

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      Компилятор воспринимает это как два разных типа: указатель и массив(и сигналит об этом в ошибке при компиляции), но работа проходит та же самая.

  • @user-zh6xg9zq5x
    @user-zh6xg9zq5x Před 8 lety +2

    Илита смотрит в 360

  • @SaleSex
    @SaleSex Před 6 lety

    У меня на флаги ругается. Пишет " unused parameter 'flags' ". ШО делать...

    • @SaleSex
      @SaleSex Před 6 lety

      #include
      #define SIZE 4
      void printString(const char string[])
      {
      printf ("%s
      ", string);
      }
      void printArrayString(const char * string[])
      {
      printf("%s
      ", string[0]);
      printf("%s
      ", string[1]);
      printf("%s
      ", string[2]);
      }
      const char * allowedFlags[] = { "--print", "--god-mode", "и т.д." };
      const char * allowedArgs[] = { "-n", "-p", "-j" };
      unsigned int checkAllowedFlags(const char ** const flags)
      {
      printf("%s
      ", "Bad argument!");
      return (0);
      }
      int main(int argc, const char ** const argv)
      {
      printf("%d
      ", argc);
      if (argc > 1)
      checkAllowedFlags(argv);
      printf("%s
      ", argv[0]);
      printf("%s
      ", argv[1]);
      printf("%s
      ", argv[2]);
      return (0);
      }

  • @zvalmontz
    @zvalmontz Před 3 lety

    ДД, а где часть 2?

    • @ANTGPRO
      @ANTGPRO  Před 3 lety

      Приветствую! Можешь посмотреть на сайте: antg.pro

    • @zvalmontz
      @zvalmontz Před 3 lety

      @@ANTGPRO на сайте я уже был, обязательно рассмотрю опцию покупки курса. Сейчас купил "Изучаем программирование на Си" от Дэвида Гриффитса. Типа бестселлер, язык уж точно получше чем Ритчи и К. =]

    • @ANTGPRO
      @ANTGPRO  Před 3 lety

      @@zvalmontz Поддерживаю! КиР не для обчения, быстрый ввод для программистов с опытом.

  • @spbvalentine
    @spbvalentine Před 8 lety

    Спасибо автору, очень подробно и качественно предоставлен материал!
    Первое что заинтересовало меня в уроках так это разбор тем работы с указателями. В целом все понятно, но никак не могу понять как можно выражениями доказать, что
    char * hello3 эквивалентно char hello3[].
    И почему указатель на строку char * hello3 = "Hello3" инициализируется значанием строки??? Переменная типа указатель должна же хранить значение адреса памяти, например 0х34ff1122 и т.п.?!
    Мысль навеяна примером работы с указателями на int, тут все прозрачно:
    int a = 5; // Переменная
    int * p = &a // Адрес переменной
    Данный момент со строками можно как-нибудь понять или проще на веру принять ?! :)

    • @ANTGPRO
      @ANTGPRO  Před 8 lety +1

      В видео я говорил о том, что имя массива это адрес его первого элемента, по сути, это указатель на адрес(!) первого элемента) И говорил о том, что работая с массивами мы работаем с указателями, говорил, что строки это массивы, а значит мы работаем с указателями, раз имя массива это указатель на адрес его первого элемента. Запись char * hello3 = "Hello3" ничто иное как массив символов завершенных символом конца строки \0. А раз это массив, то мы можем работать с ним с помощью указателя, с помощью указателя мы можем работать с любым типом данных в Си и с любыми его структурными элементами.

    • @spbvalentine
      @spbvalentine Před 8 lety +1

      Спасибо за разъяснение, зафиксирую себе эту информацию, буду осмыслять)

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Валентин Юрьевич Пожалуйста )) Еще раз стоит посмотреть, все станет на свои места.

    • @TheT735
      @TheT735 Před 8 lety +1

      День добрый :)
      Мне вот что не понятно по поводу char *hello3 = "hello3".. Если написать вывод адресов элементов такого массива, то элементы массива находятся в памяти точно так же, как элементы массива char hello3[] = "hello3", то есть последовательно символ за символом. То есть, по идее, str[0] = 'X' не должно приводить к краху программы, ведь запись идет четко в начальную ячейку массива. Может просто компилятор как то по особенному обрабатывает массивы, заданные через указатель? Не понимаю это момент, хотя должен понимать :)

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Алексей Непершев Да, дело в том как он обрабатывает массив через указатель. Я еще вернусь к этому моменту, тут у многих возникли вопросы. Сделаю урок, еще раз все разберем.

  • @user-et1rg7gl2l
    @user-et1rg7gl2l Před 8 lety

    Блин, не понятно ничего стало(

    • @ANTGPRO
      @ANTGPRO  Před 8 lety

      Что именно? Пересмотри видео и пробуй писать программы, главное не боятся, тут все просто.

    • @ANTGPRO
      @ANTGPRO  Před 7 lety

      ***** нужно смотреть дальше, не все же сразу, а то еще больше путаницы будет.

  • @troubleshooters-6744
    @troubleshooters-6744 Před 7 lety +1

    Как можно использовать еще не затронутые темы. Ввели в заблуждение.

    • @troubleshooters-6744
      @troubleshooters-6744 Před 7 lety +1

      а в общем начинали хорошо. Потом расслабились))

  • @losevskiy6985
    @losevskiy6985 Před 4 lety

    много воды из очевидных комментариев

  • @ori-d
    @ori-d Před 3 lety +1

    Все хорошо, только перестань вечно кликать на `qwe` ;D

    • @ANTGPRO
      @ANTGPRO  Před 3 lety

      Разминка))

    • @nygma9145
      @nygma9145 Před 3 lety

      Хахахах, я думал это только мне на нервы действует