15:10 жаль не затронута тема отчистки stdin, если ввести больше чем надо символов, то хоть и запишется в массив столько, сколько указали в условии while, но при следующем вызове getchar считывает оставшиеся в потоке байты.
Сергей, спасибо за уроки, очень интересно и информативно. По последней программе у меня есть одно замечание: Условие i < sizeof(bf)-1 нужно ставить первым, иначе на десятой итерации в пересенную ch читается (но не записывается в массив bf[ ] ) очередной символ из входного потока, фактически он теряется. На мой взгляд такой вариант более корректный: char bf[10], ch; int i = 0; while(i < sizeof(bf)-1 && (ch = getchar()) != ' ' && ch != EOF) bf[i++] = ch; bf[i] = '\0';
"Строка читается не целиком, а лишь до пробельного символа, и это поведение никак нельзя изменить" - тут ошибка. Мы можем указывать свои собственные спецификаторы, на которых нужно останавливать чтение. Например, scanf("%[^ ]s", array_name) будет читать строку до тех пор, пока не встретит ' '.
Сергей, сделайте, пожалуйста, курс по МО и нейросетям на степике Ваши прошлый курсы очень понравились, и было бы очень здорово потренироваться на задачах после ваших видео по МО на ютубе
Доброе время суток! Не совсем понял как работает эта строка. (ch = getchar()) != ' ' , в начале считывает в переменную ch, а затем её сравнивает с символом ' '? Запутался что то(
Здравствуйте! Проясните один момент. Зачем при использовании функции getchar создавать указатель “*ptr” на массив “bf”, если имя массива это и есть указатель на его первый элемент? Нельзя сразу использовать bf[i++] = ch; ?
Из-за того что в 1930годах кто-то через gets уязвимость заабюзил на ссаном юниксе я теперь в 2028 не могу нормально со строками рабоатать. В любом другом языке уязвимость бы исправили, но нет, у нас же надо поддерживать обратную совместимость (софт на компьютерах викторианской эпохи) и нельзя ничего менять. Вывод? Если надо работать со строками или что-то парсить - не используйте Си вообще, для этого есть питон или джава
так fgets() добавляет в конец \0 или ??? так надо менять на \0 ??? что то сказано, а нужно ли это? если сказано, то показывай, а не говори. а показано как будто не надо.
добавляет автоматом 0 после последнего прочитанного символа (' ' читается из stdin, если он мешает, то следует его самостоятельно убрать, заменив нулем)
@@lemmenmin7676 fgets добавляет в конец \0. Если введенная строка занимает не всё место (Наприм. "Hello", то когда вы её вводите нажимая enter в конец вставляется символ ' ' и получается строка выглядит как "Hello ", а потом fgets превращает её в нормальную для си строку "Hello \0"), как видно остался ' ' символ - его нужно убрать, иначе при вставке будет выведена строка и сразу перенос. Если нужно то нужно, а если не нужно, то не нужно. Обычно никому не нужна строка включающая прямо в себе перенос строки.
15:10 жаль не затронута тема отчистки stdin, если ввести больше чем надо символов, то хоть и запишется в массив столько, сколько указали в условии while, но при следующем вызове getchar считывает оставшиеся в потоке байты.
Сергей, спасибо за уроки, очень интересно и информативно.
По последней программе у меня есть одно замечание:
Условие i < sizeof(bf)-1 нужно ставить первым, иначе на десятой итерации в пересенную ch читается (но не записывается в массив bf[ ] ) очередной символ из входного потока, фактически он теряется.
На мой взгляд такой вариант более корректный:
char bf[10], ch;
int i = 0;
while(i < sizeof(bf)-1 && (ch = getchar()) != '
' && ch != EOF)
bf[i++] = ch;
bf[i] = '\0';
Я правильно понимаю, что
bf[i++] = ch
это тоже самое, что и
bf[i] = ch
i += 1
?
Да, вы правильно понимаете.
Доброе утро! Спасибо за Ваши видео! Как раз на JavaScript потоки ввода/ вывода на прошлой неделе проходили 🙂
Спасибо тебе за полезный контент! Продолжай в том же духе!
"Строка читается не целиком, а лишь до пробельного символа, и это поведение никак нельзя изменить" - тут ошибка. Мы можем указывать свои собственные спецификаторы, на которых нужно останавливать чтение. Например, scanf("%[^
]s", array_name) будет читать строку до тех пор, пока не встретит '
'.
Спасибо. Многое прояснилось.
спасибо!👏👍
Сергей, сделайте, пожалуйста, курс по МО и нейросетям на степике
Ваши прошлый курсы очень понравились, и было бы очень здорово потренироваться на задачах после ваших видео по МО на ютубе
Спасибо
Сергей, здравствуйте! Видео как всегда супер! Подскажите пожалуйста, когда Ваш курс по Cи ожидать на Stepik?
Ох, этого не знаю, даже пока не думал его делать ))
Доброе время суток! Не совсем понял как работает эта строка. (ch = getchar()) != '
' , в начале считывает в переменную ch, а затем её сравнивает с символом '
'? Запутался что то(
да, именно так (сравнивает на неравенство)
@@selfedu_rus спасибо
Сергей, а сколько вы всего знаете языков программирования?
Здесь вопрос, что значить знать? )) Лучше спросить, на скольких программировал. Где-то 5-7, как считать.
@@selfedu_rus Очень круто!
Здравствуйте! Проясните один момент. Зачем при использовании функции getchar создавать указатель “*ptr” на массив “bf”, если имя массива это и есть указатель на его первый элемент? Нельзя сразу использовать bf[i++] = ch; ?
В данном случае можно.
Из-за того что в 1930годах кто-то через gets уязвимость заабюзил на ссаном юниксе я теперь в 2028 не могу нормально со строками рабоатать. В любом другом языке уязвимость бы исправили, но нет, у нас же надо поддерживать обратную совместимость (софт на компьютерах викторианской эпохи) и нельзя ничего менять.
Вывод? Если надо работать со строками или что-то парсить - не используйте Си вообще, для этого есть питон или джава
так fgets() добавляет в конец \0 или
???
так надо менять
на \0 ???
что то сказано, а нужно ли это?
если сказано, то показывай, а не говори.
а показано как будто не надо.
добавляет автоматом 0 после последнего прочитанного символа ('
' читается из stdin, если он мешает, то следует его самостоятельно убрать, заменив нулем)
@@selfedu_rus не сказано куда добавляется '
'. в конец строки, но ведь там больше нет места или куда? в память следущую за массивом? в поток?
@@lemmenmin7676
fgets добавляет в конец \0.
Если введенная строка занимает не всё место (Наприм. "Hello", то когда вы её вводите нажимая enter в конец вставляется символ '
' и получается строка выглядит как "Hello
", а потом fgets превращает её в нормальную для си строку "Hello
\0"), как видно остался '
' символ - его нужно убрать, иначе при вставке будет выведена строка и сразу перенос.
Если нужно то нужно, а если не нужно, то не нужно. Обычно никому не нужна строка включающая прямо в себе перенос строки.
@@lemmenmin7676 он не добавляется, он читается из входного потока и не удаляется, как это делает, например, функция scanf()
@@SergGin1 спасибо, а автор канала говорит, что никуда
не добавляется, а если всё место, то что, не добавляется?