|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Добрый день. Кто мне объяснит как работает функция getchar() на примере вот такого кода из книги Кернигана: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Я тут не понимаю "кто" (каким образом) считывает как бы строку с клавиатуры. Предполагаю, что возможно(может и неверно), что вот эта строка в цикле c = getchar(); она как бы двигает маркер в потоке символов и выдаёт по одному символу в переменную c. но когда поток пуст функция работает как что-то вроде считывания строки с клавиатуры до того как кто-то не нажал Ctrl+z. Как только нажали эту комбинацию строка помечается символом EOF и поток считается законченным. Если моё предположение верно, то тогда всё ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 22:52 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
В зависимости от системы (и прочих опций stdin) ввод с клавиатуры может буферизироваться до нажатия клавиши "Enter" и в программу попадать только после этого. Так удобнее: можно отредактировать опечатки. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 23:09 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov В зависимости от системы (и прочих опций stdin) ввод с клавиатуры может буферизироваться до нажатия клавиши "Enter" и в программу попадать только после этого. Так удобнее: можно отредактировать опечатки. это даже не самое главное тут . мне непонятно кто читает с клавы символы . всё указывает на то, что это делает c=getchar() в случае если буфер пуст, а если не пуст, то двигает маркер и выдаёт символ, вычищая его из буфера до тех пор пока не вычистит весь буфер , а потом опять считывает с клавы и т.д. по циклу. но пока это только мои фантазии. так как я нигде ответа на мой вопрос не нашёл. ни в книге, ни в гуглях. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 23:15 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81мне непонятно кто читает с клавы символы Контроллер клавиатуры. Он отправляет их в системный блок. Там они попадают в драйвер клавиатуры. Оттуда - в буфер операционной системы. Потом в буфер stdin. и вот оттуда уже их вычитывает getchar(). А если в stdin пусто, он ждёт пока операционка чего-нибудь туда не покладёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 23:33 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81мне непонятно кто читает с клавы символы Контроллер клавиатуры. Он отправляет их в системный блок. Там они попадают в драйвер клавиатуры. Оттуда - в буфер операционной системы. Потом в буфер stdin. и вот оттуда уже их вычитывает getchar(). А если в stdin пусто, он ждёт пока операционка чего-нибудь туда не покладёт. вы написали на низком уровне. а на уровне Cи кто это делает ? хорошо давайте упростим . давайте по тупому ))) перепишем так : Код: plaintext 1. 2. 3.
программа запустилась и не дала мне ввести никакую строку. то ли дело если я напишу вот так : Код: plaintext 1. 2. 3. 4.
а тут уже даст ввести какую-то строку. а почему ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 23:45 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
потому что ф-я getchar() запускает ожидание события (нажатия на кнопку) а потом обрабатывает его ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 01:25 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81а на уровне Cи кто это делает ? Какую букву из "stdin" ты не заметил в описании сабжа? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 01:32 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81 вы написали на низком уровне. а на уровне Cи кто это делает ? На уровне С под капотом происходит следующее. Каждая программа запускается сразу с 3-мя уже открытыми файлами под дескрипторами 0, 1, 2. Файл 0 отвечает за ввод из терминала (хотя при необходимости командная оболочка может перенаправить туда любой файл или вывод другой программы). Рантайм С берет дескриптор 0 и подкючает его к глобальному объекту stdin, который представляет собой буферизированный файловый поток (стандартный тип в С: FILE). Остальные тоже подключаются в свои потоки. При чтении из stdin происходит чтение из дескриптора 0, которое в свою очередь приводит к чтению вводимых в терминале символов (перенаправление не рассматриваем). Если ввода еще не было, то операция чтения блокирует вызывающй код пока либо что-то не введут, либо не будет достигнут "конец файла" (обычно при перенаправлении файлов, хотя и в терминале тоже можно ввести конец файла.). Фунция getchar просто читает один символ из stdin. Если никакого чтения не делать то программа просто завершается, без ожидания, потому что ожидание происходит именно во время операции чтения. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 01:58 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
[quot Anatoly Moskovsky#22089921] andron81 Фунция getchar просто читает один символ из stdin. Если никакого чтения не делать то программа просто завершается, без ожидания, потому что ожидание происходит именно во время операции чтения. тогда непонятно вот тут если пройтись отладчиком первая строчка c = getchar(); отрабатывает ввод с клавиатуры . затем после нажатия "Enter" мы начинаем хождение по циклу. доходим до первой строки c = getchar(); происходит операция чтения , но ожидания ввода почему не происходит (или происходит, но я его не вижу :) )? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 10:11 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Символьный ввод-вывод (типично) построчный и буферизированный. Если буфера и строки нет в вашей программе, это ещё не значит, что их нет вообще нигде. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 12:04 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Символьный ввод-вывод (типично) построчный и буферизированный. Если буфера и строки нет в вашей программе, это ещё не значит, что их нет вообще нигде. да кто ж против то. символы кто считывает ? словно readln в паскале я полагаю, что getchar и считывает, если буфер пуст, а если не пуст , то не считывает , а выдаёт символ за символом из буфера. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 14:03 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81символы кто считывает ? stdin. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 14:15 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
По сути в статической инициализации main процесса работает нечто вроде Код: plaintext 1. 2. 3.
И Код: plaintext 1.
эквивалентен Код: plaintext 1.
Если в консоли жоглировать птичками "<" ">" то можно переподключать эти потоки на файлы. Например Код: plaintext 1.
Здесь также поток ошибок STDERR перенаправляется в STOUT через 2>&1 Или есть более подробный синтаксис когда указываются явно дескрипторы 0,1,2 рядом с птичками но этим обычно никто не пользуется и все пишут кратко. Или с помощью операции pipe "|" делать конвейеры обработки когда выхлоп одной утилиты является входом другой. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 14:34 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81 первая строчка c = getchar(); отрабатывает ввод с клавиатуры . затем после нажатия "Enter" Тут у вас ошибка. Первый getchar возвращает значение только после нажатия Enter (т.к. обычно ввод с терминала буферизируется построчно). При этом возвращаемое значение - это первый введенный символ. Остальные введенные символы включая Enter тоже читаются на этом этапе (все сразу) и складываются в буфер stdin. Последующие вызовы getchar читают прямо из буфера (как из массива) пока там что-то есть. После исчерпания буфера следующий getchar будет ждать ввода снова, и загрузит очередную порцию символов в буфер и вернет первый из них. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 21:23 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky andron81 первая строчка c = getchar(); отрабатывает ввод с клавиатуры . затем после нажатия "Enter" Тут у вас ошибка. Первый getchar возвращает значение только после нажатия Enter (т.к. обычно ввод с терминала буферизируется построчно). При этом возвращаемое значение - это первый введенный символ. Остальные введенные символы включая Enter тоже читаются на этом этапе (все сразу) и складываются в буфер stdin. Последующие вызовы getchar читают прямо из буфера (как из массива) пока там что-то есть. После исчерпания буфера следующий getchar будет ждать ввода снова, и загрузит очередную порцию символов в буфер и вернет первый из них. ну вот это я и хотел услышать. а то все в научность ударяются. спасибо большое ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 07:53 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Сложно объяснять элементарные вещи. От "научности" это не зависит - лично мне всегда(?) было очевидно, что система сначала читает в собственный строчный буфер и уже потом отдаёт строку (символы) приложению. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 10:56 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81ну вот это я и хотел услышать. А ничего, что это уже было сказано в первом же ответе?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 13:30 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81ну вот это я и хотел услышать. А ничего, что это уже было сказано в первом же ответе?.. ничего... так как вот этой фразы я от вас не услышал: "После исчерпания буфера следующий getchar будет ждать ввода снова" я собственно так и предполагал(описав в самом первом сообщении), но никто мне так и не опроверг и не подвердил кроме Московского. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 14:59 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
andron81я собственно так и предполагал(описав в самом первом сообщении), но никто мне так и не опроверг и не подвердил кроме Московского. Так, может, стоит начать-таки читать ответы? Например, второй в теме: яА если в stdin пусто, он ждёт пока операционка чего-нибудь туда не покладёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 15:38 |
|
как все же работает getchar
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81я собственно так и предполагал(описав в самом первом сообщении), но никто мне так и не опроверг и не подвердил кроме Московского. Так, может, стоит начать-таки читать ответы? Например, второй в теме: яА если в stdin пусто, он ждёт пока операционка чего-нибудь туда не покладёт. ну это уже ваше сообщение №2 . вы же говорили о первом. да и изложено в этом №2 языком который мне пока не по зубам . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 08:51 |
|
|
start [/forum/topic.php?fid=57&msg=39932608&tid=2017463]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 274ms |
total: | 409ms |
0 / 0 |