Программирование на Си. #17. Строки. Часть 1.
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
#программирование
#языкси
#урокиси
#старыйкурс
#старыеуроки
🚀 Подписывайся на мой канал в Telegram: @antg_official
🚀 И заходи на сайт: antg.pro!
Шикарно! Спасибо большое! Рад что новые выпуски пошли!
Отличные уроки! идут как дети в школу)) Спасибо, Гена)
Вот тут нормально разогнался. Реально интересно. С меня лайк и подписка.
Вуху! Дико радуешь последнее время) огроменное спасибо!)
Пожалуйста ))
Благодарю за урок! Нашел все, что искал!
я глазам своим не верю ... так регулярно видео выходят просто супер ))
Стараюсь ))
Хорошо и понятно объяснил)
Отличная подача материала
Спасибо!
спасибо огромное!
очень рад тебя видеть)
Приятно )
Вы нас балуете.))))
Гендос норм урок!
А можно ли создавать и использовать многомерные массивы состоящие из разных типов элементов, например текста и чисел?
И еще можно ли по аналогии с PHP создавать и использовать ассоциативные массивы, где ключом было бы число а значением текст?
переменная локальная, это значит, что она передается через стековый фрейм, то бишь там будет мусор. Если бы была глобальная неинициализированная переменная, то там были бы нули, тк проц такие переменные заносит в сегмент .bss, который при запуске программы полностью зануляется (к слову о самостоятельной задаче в начале)
Помню начинал изучать программирования два года назад на твоих уроках, теперь уже знаю 4 языка программирования.
Смотря как знаешь ) спецов я вижу редко.
Понты дороже денег)
Почему это видео попалось мне в рекомендации, уже когда я получил зачёт по программированию?
Можно как-то изменить адрес массива или переменной в С++? При операции hello3 = hello4; меняется только значение
Гена, спасибо за новые видео, надеюсь это не просто наваждение какое то а именно работает идея и новые виде так и будут выходить, скоро ооп будет?
Сначала продвинутый курс а там и ООП.
Привет, мне задали задание в котором нужно вывести график на екран, хочу выполнить его на С99, но так как в консоли это сделать невозможно, какую среду разработки можете посоветовать?
спасибо за урок =) все что я понял)
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;
}
for(int i=0;i
Вы меня выручили!!! Спасибо!!! Можно я вам задоначу? Я страдал 3 часа и не мог в *имя строке изменить символы, посмотрел ваше видео, все понял, все получилось! Спасибо вам огромнейшее!!! Киньте ссылку для доната!
Донатов нет, но можете купить новый курс на antg.pro
Гена честно, до этого урока объяснял все супер, повторял много и все было ясно. Тут же все очень быстро, нечего не понятно хоть уже 100 раз его пересмотрел и 90% написанного кода у меня вообще не работает... (((
Компилируй с флагом --std=c99
На практических примерах разберемся лучше, не волнуйся, это пример реальной программы.
Как в "const char* states[]= {"Moscow","New-York"}" посчитать кол-во символов допустим в "Moscow"?
Обратиться по индексу массива и использовать strlen: size_t length = strlen(states[0]);
Приветствую. А видео об "if... else" "switch, case" есть ?
кстати нет) Запишу!
Gena ANTG Благодарю =)
ура видос) что ты думаешь о книге по си керигана и ритчи?
краткий ввод в Си и его демонстрация, как учебник не очень.
+Gena ANTG спасибо ти за быстрый ответ)
Как сказал товарищ капитан из "Зеленого слоника" : "Это классика, это знать надо!".
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
Ничего себе.
Если что, я об этом говорил в первых уроках. Йо.
Ок.
за const char * const hello4 лайк!😎
А где вторая часть? Скоро год уже, как блокбастеры в Голливуде прям
Помогите пожалуста, а как в саблайме компилировать и запускать cpp файл( на С++), подскажите что делать?
компилировать - tools -> build system | build
путаюсь с тем где какие маркеры юзать, как бы от этого избавиться
И ещё, делай в описании пожалуйста вставку с временем откуда начинается та или иная тема.
Ооо) Это пока не обещаю )) мне бы видео записать, и так времени мало )
Ну в таком случае лучше видосики:)
Привет Гена! У меня такой вопрос: квадратная матрица целых чисел типа short передается в функцию аналогично массиву строк?
да, только с типом short. Я еще запишу видео по массивам.
Не могу понять почему компилятор выдает ошибку
#include
void VyvodDannyh (short **array)
{
// Вывод данных на экран
printf("
","Elementy matricy");
for (char i=0;i
Ирина Ковалева а ошибка какая? в данном случае лучше использовать форму записи: short array[][] и передавать в функцию кол-во строк и колонок в массиве, 3 аргумента
Все получилось! Только я не совсем поняла почему((( Вы же вроде говорили, что **array это то же самое, что *array[] и соответственно array[][] . В чем разница?
Ирина Ковалева нужно видеть вашу ошибку
Приветствую, какая у тебя тема в ubuntu
Привет!
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
я вот чего не понял .
Вроде типа , например , char* name = &name; мы использовали для адреса и присвоение переменной значение адреса
тип char *name использовали для вывода значения , указаном в адресе
а что такое char * name ?
нужно еще раз смотреть, char * name - указатель, *name - читаем значение по адресу указателя
Здравствуйте. Помогите, пожалуйста, разобраться. Решил поиграться со строками, и вот какая неувязка:
Пытаюсь передать в функцию массив строк следующим образом
#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
З.Ы: и почему нельзя вычислить размер массива внутри функции?
С этой темой мы детально разберемся в новом курсе.
Объяснять нужно будет на примерах.
Народ, а как в строке заменить например httht//tttt/qqqqq чтобы выводило httht//-spam-/qqqqq
Это долго объяснять)) конкретно на Си это не так просто как с более новыми языками)
Отличная тема и очень сложная. После всяких ждав, питонов и прочего - очень не простая тема. И инфу сходу найти очень сложно.
Ребят, поправьте если я не прав. Я правильно понял, что в случае на 19:15 после выполнения кода hello3 = hello4, т.е. переменная hello3 стала хранить адрес "Hello4", мы фактически потеряли адрес, где хранилась строка "Hello3"?! И тогда возникает вопрос, если моя мысль конечно верна, можно ли каким-то образом найти строку "Hello3" и как это сделать, если единственный способ как мы могли к ней обратиться - это через указатель hello3 до его переприсваивания.🤔🤔
пожалуйста, можно больше повторений, так и не смог понять что делает const
Ахах)
Здравствуйте Геннадий!Такая таблица сойдет?Можно было и по другому в принципе сделать,но мне так удобнее было
#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;
}
строкУ, а не стрОку, а так молодец)
Спасибо! ))
Если массив это указатель, то почему тогда:
char *s1 = "Это строка";
char s2[] = "Это строка";
//Компилируется и работает
while (*s1 != '\0')
{
printf("%c", *s1);
s1++;
}
//Не компилируется и не работает
while (*s2 != '\0')
{
printf("%c", *s2);
s2++;//компилятор ругается на эту строку
}
Компилятор воспринимает это как два разных типа: указатель и массив(и сигналит об этом в ошибке при компиляции), но работа проходит та же самая.
Илита смотрит в 360
У меня на флаги ругается. Пишет " unused parameter 'flags' ". ШО делать...
#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);
}
ДД, а где часть 2?
Приветствую! Можешь посмотреть на сайте: antg.pro
@@ANTGPRO на сайте я уже был, обязательно рассмотрю опцию покупки курса. Сейчас купил "Изучаем программирование на Си" от Дэвида Гриффитса. Типа бестселлер, язык уж точно получше чем Ритчи и К. =]
@@zvalmontz Поддерживаю! КиР не для обчения, быстрый ввод для программистов с опытом.
Спасибо автору, очень подробно и качественно предоставлен материал!
Первое что заинтересовало меня в уроках так это разбор тем работы с указателями. В целом все понятно, но никак не могу понять как можно выражениями доказать, что
char * hello3 эквивалентно char hello3[].
И почему указатель на строку char * hello3 = "Hello3" инициализируется значанием строки??? Переменная типа указатель должна же хранить значение адреса памяти, например 0х34ff1122 и т.п.?!
Мысль навеяна примером работы с указателями на int, тут все прозрачно:
int a = 5; // Переменная
int * p = &a // Адрес переменной
Данный момент со строками можно как-нибудь понять или проще на веру принять ?! :)
В видео я говорил о том, что имя массива это адрес его первого элемента, по сути, это указатель на адрес(!) первого элемента) И говорил о том, что работая с массивами мы работаем с указателями, говорил, что строки это массивы, а значит мы работаем с указателями, раз имя массива это указатель на адрес его первого элемента. Запись char * hello3 = "Hello3" ничто иное как массив символов завершенных символом конца строки \0. А раз это массив, то мы можем работать с ним с помощью указателя, с помощью указателя мы можем работать с любым типом данных в Си и с любыми его структурными элементами.
Спасибо за разъяснение, зафиксирую себе эту информацию, буду осмыслять)
Валентин Юрьевич Пожалуйста )) Еще раз стоит посмотреть, все станет на свои места.
День добрый :)
Мне вот что не понятно по поводу char *hello3 = "hello3".. Если написать вывод адресов элементов такого массива, то элементы массива находятся в памяти точно так же, как элементы массива char hello3[] = "hello3", то есть последовательно символ за символом. То есть, по идее, str[0] = 'X' не должно приводить к краху программы, ведь запись идет четко в начальную ячейку массива. Может просто компилятор как то по особенному обрабатывает массивы, заданные через указатель? Не понимаю это момент, хотя должен понимать :)
Алексей Непершев Да, дело в том как он обрабатывает массив через указатель. Я еще вернусь к этому моменту, тут у многих возникли вопросы. Сделаю урок, еще раз все разберем.
Блин, не понятно ничего стало(
Что именно? Пересмотри видео и пробуй писать программы, главное не боятся, тут все просто.
***** нужно смотреть дальше, не все же сразу, а то еще больше путаницы будет.
Как можно использовать еще не затронутые темы. Ввели в заблуждение.
а в общем начинали хорошо. Потом расслабились))
много воды из очевидных комментариев
Все хорошо, только перестань вечно кликать на `qwe` ;D
Разминка))
Хахахах, я думал это только мне на нервы действует