Тёмный

Указатели символьные строки и функции. Строки и указатели в c++. C ++ Для начинающих. Урок #63 

#SimpleCode
Подписаться 368 тыс.
Просмотров 129 тыс.
50% 1

Понравилось видео или оказалось полезным? Подпишись!
Указатели символьные строки и функции. Строки и указатели в c++. C ++ Для начинающих. Урок #63
Домашнее задание
Написать свою реализацию функции strlen
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit

Опубликовано:

 

10 авг 2017

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 157   
@-urdy
@-urdy 6 лет назад
В последних версиях VS 2017 по умолчанию при создании проекта ставит флаг (/permissive-) в настройках проекта, и запись char *ch = "string" нельзя писать нужно делать const chart *ch = "string". Если выключить то работать будет, но рекомендуется не выключать этот флаг, а просто везде использовать const char. Так как указатель на массив char константный.
@user-hn8jl8ym1e
@user-hn8jl8ym1e 5 лет назад
Спасибо!
@hustler3335
@hustler3335 5 лет назад
spasibo!
@pavelios3577
@pavelios3577 5 лет назад
uRDy Огромное спасибо, уважаемый! Только начинаю изучение, завис бы по полной!
@Szesorvs
@Szesorvs 5 лет назад
Спасибо, если использовать не константную переменную, даже в online компиляторах предупреждение выводит.
@user-io3tc2cx7v
@user-io3tc2cx7v 5 лет назад
Виталий Сахно только что а у меня в VS 17 на 15 строке : char string = "Привет!!"; - не принимает слово "Привет" (выделяет красным)- пишет: "Значение типа const char нельзя использовать для инициализации типа char" а если сделаю char *string = str; - то все нормально - принимает! A c const - проблема решилась - спасибо!
@Salavat1k
@Salavat1k 5 лет назад
Сергей, спасибо вам за ваш труд. Это потрясающе.
@SVV_94
@SVV_94 Год назад
31 января 2023 год на улице война ,всем привет . Видео очень актуальное и полезное . Спасибо , очень доходчиво учусь полностью с 0 по твоих видео. Но к сожалению почти 30 лет ,тяжеловато уже учить и засвоить полностью материал.
@SVV_94
@SVV_94 Год назад
@Valentin Morozov Как минимум: 1)мозг не так быстро всё запоминает как раньше, например в 18 лет 2) Я инженер строитель , благо математический склад ума , но совсем другая деятельность на протяжении 7 лет . 3) С каждым годом теряется гибкость ума
@trier1118
@trier1118 Год назад
Разработчиком можно стать в любом возрасте,главное желание и упорство.Удачи!
@user-xu7pq7yn3b
@user-xu7pq7yn3b Год назад
@@SVV_94 Привет, мне 42 и норм, но есть одно правило в программировании- нельзя пить синьку(вообще нисколько) и желательно не смолить, если придерживаться то через 3-4 недели увидишь, что обретаешь ясность ума и состояние потока, только выпьешь, - на месяц поиск мотивов учиться дальше, спутанность сознания, попытки сегодня "отдохнуть" и продолжить обучение завтра и т.д. С пивасом, выше верстальщика не стать. А вообще мне известны программисты и за 70!
@Comandante_
@Comandante_ Год назад
@@SVV_94 Странно. Я наоборот в 18 лет вообще не соображал и никак не усваивал программирование, когда учился в шараге. Зато сейчас в 30 лет инфа залетает на ура))
@By_B0SS
@By_B0SS Год назад
@@user-xu7pq7yn3b согласен с тобой , ну тяжело понимать все равно код а особенно все запомнить )) и что то написать самому даже со старых уроков я уже забыл (( ту же рекурсию хотя помню массивы цикл и тд ) и это бывает пугает типа ага не могу запомнить или не могу сделать значит не мое и закину на потом
@archiechellaut9483
@archiechellaut9483 2 года назад
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
@Evgeny..
@Evgeny.. 3 года назад
Как выручают ваши видео. Вместо сложного универского учебника смотрю ваши уроки)) Спасибо Вам! Очень драгоценный труд!
@max325475685
@max325475685 6 лет назад
Спасибо за уроки!!!
@Ms001man
@Ms001man 5 лет назад
Спасибо за урок!
@SimpleCodeIT
@SimpleCodeIT 7 лет назад
#строки #указатели #SimpleCode #урокипрограммирования
@user-sx4gr8uk5h
@user-sx4gr8uk5h 6 лет назад
void func(char *string) { int quantity = 0; for (int i = 0; ; i++) { if (string[i] != '\0') { quantity++; } else { break; } } cout
@user-kw4uk7dm3z
@user-kw4uk7dm3z 6 лет назад
thanks a lot!
@user-wo1dx1rz4z
@user-wo1dx1rz4z 6 лет назад
Спасибо
@user-kb6qd8rg4g
@user-kb6qd8rg4g 4 года назад
спасибо
@SeshAlex
@SeshAlex 6 лет назад
Без const не хочет код работать - const char *strArr[] = { "Hello", "World", "TEST" }; Причем везде, как при обявлении указателей, так и в параметрах функций. Видимо сейчас ваш код не актуален.
@verbof2527
@verbof2527 2 года назад
Как я понял, с 2017 так уже не написать. Создал динамическую строку, все работает: char* str = new char[]{“Hello”}; И ещё, char str[] = “Hello” тоже работает, а это равнозначно char* str = “Hello”
@user-wu9es9po1s
@user-wu9es9po1s 6 лет назад
Почему когда выводим строчку на экран , предварительно не нужно разыменовывать указатель, по идее , если мы пишим cout
@SeshAlex
@SeshAlex 6 лет назад
Тоже такой вопрос возник.
@neotremor5054
@neotremor5054 6 лет назад
потому что строка береться как массив символов,а название массива это указатель на его первый элемент,поэтому прокатывет
@snobou12
@snobou12 5 лет назад
@@neotremor5054 первый элемент строкового массива,это и есть эта строка с Hello
@banaaboy6504
@banaaboy6504 5 лет назад
Тоже не понял. Не совсем аналогия с массивами получается. Разыменования нет при выводе.
@user-nl3wz6cz2s
@user-nl3wz6cz2s 5 лет назад
Потому что в функцию берется уже разыменованый указатель, так как указывает на указатель.
@user-ye7vc6ug1l
@user-ye7vc6ug1l 5 лет назад
Спсб
@user-bb1nk1po5e
@user-bb1nk1po5e Год назад
привет из 2023. Спасибо большое за уроки!"
@office24online79
@office24online79 5 лет назад
Вот тут немного со строками намудрено и судя по всему в MVS 2017 все работает не так как указано в данном видео. Прошу по возможности разобрать рботу в крайней версии MVS. Заранее благодарен!
@olderback6554
@olderback6554 7 лет назад
Добавь теги канала. они помогут найти тебя!
@odnorob
@odnorob 2 года назад
Если мы создаем массив интов например int arr[] = { 1,5,7,3,11 }; то собственно сам arr уже является указателем и его можно использовать напрямую. С массивом char так нельзя? Нужно обязательно создавать новый указатель char* ptr = char_array_name? И еще - 1:57 почему, когда мы выводим на экран указатель string, то он разыменовавается (но мы же хотим сам указатель, верно?) и выводится содержимое памяти а не адрес начала массива?
@antonovka1359
@antonovka1359 Год назад
По сути решение домашки это sizeof(str)-1 но кажется такое решение не засчитают
@forixsins
@forixsins 8 месяцев назад
Вот самый простой вариант, проще только пареная репа: int String_Length(const char* const str) { int a = 0; while (str[a] != '\0') { a++; } return a; }
@denlykh3361
@denlykh3361 6 лет назад
char *string = "Hello!" - подсказывает (const char[7])"Hello!" - компилятор выдает ошибку; const char *string = "Hello!"; - компилируется без ошибки. То же с массивом строк: const char *strArr[] = { "Hello","World","TEST" }; - без ошибки. Функция: void foo(const char *str) { cout
@LaiksVel
@LaiksVel 6 лет назад
удалось выяснить в чем дело? таже проблема...
@LaiksVel
@LaiksVel 6 лет назад
вроде работает если использовать const char *arr; вместо просто char *arr;
@WotsTheMan
@WotsTheMan 6 лет назад
Ты не можешь в указатель присваивать масив. Всё что можно это лишь присвоить указатель на первый елемент. А масив символов нужно создавать отдельно как и было показано в видео.
@-urdy
@-urdy 6 лет назад
выше ответ написал
@eduardeduard933
@eduardeduard933 4 года назад
Спасибо за видео int dz(char *a) { int re = 0; for (int i = 0 ; ; i++) { if (a[i] == '\0') { return re; } re++; } }
@1oneorigin50
@1oneorigin50 6 лет назад
А как происходит копирование массива char? И почему с int по-другому?
@NoOneNOW
@NoOneNOW Год назад
Ребят, код может работать без const если выключить режим совместимости(Проект -> свойства -> С/С++ -> Язык -> Режим совместимости)
@shokweiv
@shokweiv Год назад
Привет, если не сложно, можешь пожалуйста объяснить на что конкретно влияет изменение этого параметра?
@By_B0SS
@By_B0SS Год назад
спс работает
@arsenskliarenko9623
@arsenskliarenko9623 5 лет назад
Есть чар массив с большим количеством элементов(цифры), как разбить эти строки на пробелы ? Гайз срочно!!!)))
@Sooderone
@Sooderone Месяц назад
🧠
@samnext7911
@samnext7911 2 года назад
Сделал два варианта : 1) int counter = 0; int i = 0; while (str[i] != '\0') { i++; counter++; } cout
@youtubemanok
@youtubemanok 3 года назад
Почему в 11 строке strlen(str) , а не strlen(*str) ? Разыменовывать не нужно? Не могу никак понять. Объясните пожалуйста.
@TGrod
@TGrod 3 года назад
штука со строками очень странная. Как я понял, это не надо делать, потому что в языке так сделано) т.е. ты даёшь программе первый элемент СТРОКИ и она дальше идёт по неё до терминирующего нуля. Такая же фигня с cout
@dartingswimmer
@dartingswimmer 2 дня назад
Подскажите, пожалуйста. Почему при использовании sizeof на указателе мы получаем значение 8? А при использовании самого массива - значение 4. (это потому компилятор считает количество символов в адресе или как? Не понимаю -_-) void main() { char arr[] = "avi"; char const *pstring = arr; cout
@alexandrf5534
@alexandrf5534 2 года назад
Когда мы выводим значение переменной мы делаем разыменование, а когда нужно вывести массив, то почему разыменование делать не надо?
@light8290
@light8290 2 года назад
Потому что тогда мы выведем на экран первый(нулевой) элемент массива.
@Mister_Missis
@Mister_Missis Месяц назад
Почему на 2:00 при cout
@nekit180298
@nekit180298 4 года назад
ваше домашнее задание, если вы за него возьметесь
@Viamsupervadetvadens
@Viamsupervadetvadens 6 лет назад
up
@HmaPaYT
@HmaPaYT 7 лет назад
Подскажите пожалуйста, как сделать нумерацию строк (у вас синие цифры напротив слева от кода). Везде искал, но никак не могу найти. Спасибо.
@SimpleCodeIT
@SimpleCodeIT 7 лет назад
Сервис->Параметры->Текстовый редактор->С/С++. Поставить чекбокс Номера строк.
@HmaPaYT
@HmaPaYT 7 лет назад
#SimpleCode Спасибо большое
@helistrade9452
@helistrade9452 4 года назад
А как прописать код для нахождения количества букв каждого елемента массива, если слова мы выводим з клавиатуры?
@epsilon.sw_
@epsilon.sw_ 4 года назад
Нужен ли вам сейчас ответ? Я не знаю, но дам его. Хоть сам новичок. Имеем массив со строками и числовой массив (будем записывать сюда данные) передаём как аргументы в функцию которая возвращает void. Идём по первому массиву через цикл, используем для каждого элемента функцию strlen или вашу альтернативу, записываем результат в числовой массив. Числовой массив имеет длину массива строкового. Как один из вариантов
@Kokurorokuko
@Kokurorokuko 4 года назад
Можно ли поместить в ссылку массив символов по аналогии с указателем?
@Cos2.
@Cos2. 2 года назад
Да
@warface1668
@warface1668 7 лет назад
Расскажешь о библиотеке ?
@1oneorigin50
@1oneorigin50 6 лет назад
Это библиотека для графического интерфейса,и при этом не очень удобная.Ее редко используют.
@void-vj2kv
@void-vj2kv 6 лет назад
Не только. Там куча всего, включая множество системных штук
@user-nl3wz6cz2s
@user-nl3wz6cz2s 5 лет назад
Интересный факт об библиотеке - она есть. =)
@max325475685
@max325475685 6 лет назад
у меня при записи (в вашем видео) 16 стоки, компилятор ругается "значение типа "const char" нельзя использовать для инициализации сущности типа "char" " интересно, Вы мне ответите, в чём проблема?
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
На сколько я помню Visual Studio версией раннее чем 2017 такого не позволяет. Указатель тоже должен быть const.
@max325475685
@max325475685 6 лет назад
#SimpleCode спасибо за ответ. канал - это вряд-ли основной род вашей деятельности. Расскажите о себе, если вам нетрудно)
@biscvie
@biscvie Год назад
+
@safocl9768
@safocl9768 5 лет назад
/home/safff/Documents/CodeBlocks/Projects/Check_strings_len/main.cpp:9:18: ошибка: устаревшее преобразование из строковой константы в «char*» [-Werror=write-strings] char *str1 = "ter"; ^~~~~ вот чо пишет компилятор... параметры компиляции: -Wextra -Wall -Werror так чо я понял лучше не пользоваться таким преобразованием, лучше указывать как обычно массивы указывают... через char str1[] = "ter"; думаю скороа или уже в 17 стандарте отключат или отключили такую возможность...
@AShahabov
@AShahabov 4 года назад
Я же правильно понимаю, что это статический массив: char str[] = "Hello"; и хранится он в стеке?
@epsilon.sw_
@epsilon.sw_ 4 года назад
Нужен ли вам сейчас ответ? Я не знаю, но дам его. Хоть я сам новичок. Да. char* str = new char[];
@user-mn4bv3vr8l
@user-mn4bv3vr8l 2 года назад
Здравствуйте, Сергей. А у меня в VS запись char* string = "Hello"; не срабатывает ("Hello" красной волной подчеркивается)
@user-mn4bv3vr8l
@user-mn4bv3vr8l 2 года назад
char* strArr[] = {"Hello, ", "World!"}; и такая строка тоже....
@Natrium_Zincatov
@Natrium_Zincatov Год назад
Теперь надо писать const char, что всё сработало.
@shaxanematov8516
@shaxanematov8516 6 лет назад
у меня dev c++ и С "strlen" -ом не работает, что делать?
@user-sx4se9sd5c
@user-sx4se9sd5c 4 года назад
А нету простого класса стринг как в Джава и С шарпе?
@biam4962
@biam4962 4 года назад
есть, об этом позже
@egoregorrov1249
@egoregorrov1249 6 лет назад
когда пытаюсь написать строку char *strin ="Hello"; и сообщает что "значение типа const char нельзя присвоить сущности типа char" что делать?
@fillmalyshev9377
@fillmalyshev9377 6 лет назад
Скопируй и пришли весь свой код. По идее все должно работать. может быть где-то синтаксическая ошибка?
@aleksandrdrobyshev7623
@aleksandrdrobyshev7623 4 года назад
Почему когда я делаю так: char * strArr[] = {"Hello", "World", "Test"}; cout
@hopskops6136
@hopskops6136 День назад
Здесь массив указателей у тебя. Вот "H": cout
@vladalu9794
@vladalu9794 6 лет назад
#include "iostream" using namespace std; void Fun(char const *str) { int size = 0; for (int i = 0; ; i++) { size = i; if (str[i] == '\0') break; } cout
@skouliev
@skouliev 4 года назад
a если учитывая "/0",то почему там не 6 символов
@mishyka1980
@mishyka1980 4 года назад
Почему у меня str подчёркнуто?
@rafk5341
@rafk5341 Год назад
void bar(const char *str) { int i = 0; int count = 0; while (str[i] != '\0') { i++; } cout
@user-yd9iz1yw5e
@user-yd9iz1yw5e Год назад
По-моему int count не нужен
@forixsins
@forixsins 8 месяцев назад
Это не похоже на функцию strlen, она не возвращает значение, а выводит его в консоль
@sleepyNovember_project
@sleepyNovember_project 6 месяцев назад
@@user-yd9iz1yw5e бывает :D
@sleepyNovember_project
@sleepyNovember_project 6 месяцев назад
@@forixsins можно сказать и, что это похоже на функцию strlen, только она не возвращает значение а выводит его в консоль
@Salvator701
@Salvator701 5 лет назад
Вот ДЗ Первый вариант ( намудренный ) Тут я массив создаю, копирую в него все символы чаровские и их сравниваю с строковым массивом. int SCITALO4ka(const char *str) { char arr[256]; int razmer = 0; char a = '\0'; for (int i = 0; i < 256; i++) { arr[i] = (char)i; } for (int i = 0; i < 256;) { link: for (int j = 0; j < 256; j++) { if (arr[j]==str[i]&&(str[i]!=a)) { ++razmer; i++; goto link; } if (str[i]==a) { goto finish; } } } finish: return razmer; } А тут попроще вариант, доперло когда первый заканчивал. int SCITALO4KAtwoVAR(const char *str) { char a = '\0'; int razmer = 0; for (int i = 0;true; i++) { if (str[i]!= a) { ++razmer; } else { break; } } return razmer; }
@user-ww9so7sk1y
@user-ww9so7sk1y Год назад
Я чучуть не могу понять в чём тогда разница между классом string str и указателем char* str? Только в том что в классе string автоматическое освобождение памяти.
@HessW
@HessW 11 месяцев назад
Это просто разные реализации
@sleepyNovember_project
@sleepyNovember_project 4 месяца назад
У объекта класса string много полезных функций через точку
@tupoy_ytub_uberi_psevdonim
@tupoy_ytub_uberi_psevdonim 2 года назад
я не могу записать строку так как в видео, мне пишет, что константу нельзя преобразовать.
@threedking
@threedking 5 лет назад
Это странно. Почему нет вылетов? Допустим указатель на чар указывает на первый элемент массива, но если поменять значение, то залезем в другую память и будет утечка старого массива? Нужен const
@desiquant
@desiquant 3 года назад
Latest Working Code: void length(const char* string) { int i = 0; char null_pointer = '\0'; do { i++; } while (string[i] != null_pointer); cout
@user-of8lu3xe7j
@user-of8lu3xe7j 5 лет назад
#include using namespace std; int number(char *arr) { for (int i = 0;i < i+1; i++) { char a = '\0'; if (arr[i] == a) { return i; } } } void main() { setlocale(LC_ALL, "ru"); char arr[] = "приветик"; cout
@lolbefree
@lolbefree 3 года назад
char *ch = "Hello, World!"; int count = 0; while (*ch != '\0') может кто-то не решит ch++
@dreamypioneer3760
@dreamypioneer3760 5 лет назад
Куча ошибок, сделал так void foo(string *str) { cout
@maximusisus6123
@maximusisus6123 3 года назад
void foo1(const char* strArrey, int size) { for (int i = 0; i < size; i++) { cout
@thekingofgoodness606
@thekingofgoodness606 4 года назад
Мой чертовски тупой код: #include using namespace std; int ReturnMain() { int main(); return main(); } int main() { setlocale(LC_ALL, "ru"); const int Clr = system("color 0A"); char r[] = "hello world"; char r2[] = "hello world"; cout > r; cout
@Vladimir-zp4kw
@Vladimir-zp4kw 2 года назад
Hello подчеркивается красным и программа не работает
@n3onn439
@n3onn439 11 месяцев назад
в более современных версиях C++ инициализация строкой символов (C-style строками) должна выполняться с использованием типа const char*, потому что строковые литералы являются неизменяемыми. В старых версиях компиляторов такое присваивание могло быть допустимым, но в современных стандартах C++ это считается неверным.
@n3onn439
@n3onn439 11 месяцев назад
const char* str = "Hello"; Либо же char str[] = "Hello";
@Ilya_i991
@Ilya_i991 5 месяцев назад
@@n3onn439 потом выдаст исключение
@user-ql5jr9gi1n
@user-ql5jr9gi1n 4 года назад
здрасти у меня вопрос почему нужно писать так char charMyName[]= а не так char MyName[]=
@olegbocharnikov950
@olegbocharnikov950 2 года назад
2022 ГОД РАБОТАЕТ ЕСЛИ char ОБЪЯВИТЬ КОНСТАНТНЫМ const char *masiv_slov[]= { "раз","два","три" ,"\0"};
@Ermine882
@Ermine882 7 лет назад
Спасибо за урок!
@gagikarakelyan6014
@gagikarakelyan6014 4 года назад
спасибо
Далее
Зачем нужны указатели в C++?
8:14
Просмотров 4,3 тыс.
Добро пожаловать в C++
16:08
Просмотров 452 тыс.