![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
alnight |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 29.11.2012 Репутация: нет Всего: нет |
Вопрос по коду из книги Кернигана и Ритчи.
Код программы подсчета символов:
Все работает хорошо, если входные данные такие:
Все хорошо, 4 символа в 1 строке, символ EOF не считается, допустим. Но если я ввожу вот такие данные:
То мало того, что, оказывается, программа не реагирует на EOF не с начала строки, так еще и не считает после ^Z символы в строке. НО! Игнорирует лишь простые символы, а вот перевод строки, которая идет после ^Z в 1 строке все равно подсчитывается. Поэтому воникает 2 вопроса: 1) почему программа не реагирует на ^Z не в начале строки? 2) раз уж не раегирует и не считает символы после ^Z, почему все-таки считается переход на новую строку? |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
особенности - в устройстве консоли: символы пересылаются в программу построчно, т.е. не по мере ввода, а после перевода строки. при вводе из файла, например, такого эффекта не будет (можно проверить, не меняя программу, если перенаправить стандартный ввод при помощи '<')
Добавлено через 12 минут и 54 секунды поиграться с консолью windows и понаблюдать как интерпретируется ввод можно вызвав командный интерпретатор cmd.exe и выполнив в нем команду copy con: con: все вводимое с консоли будет выводиться на консоль |
|||
|
||||
alnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 29.11.2012 Репутация: нет Всего: нет |
Построчно, но разве программа не разбирает строку посимвольно, чтобы определить, что же там за символ? Почему она видит EOF только в начале и игнорирует в середине?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
программа разбирает посимвольно, но ОС передаёт символы не в момент нажатия на клавишу, а после Enter. Это особенность драйвера консоли, и к работе программы по сути не относится.
а в середине не должно игнорировать, ошибся походу.. copy con: con: выводит до первого ^Z, неважно где он. впрочем, может быть ваша консоль работает чуть иначе)) пять копеек про К&R: это, конечно, классика, но некоторые объяснения могут оказаться несколько устаревшими старомодными Добавлено через 5 минут и 31 секунду что бы не зависеть от разных эффектов предлагаю тут потренироваться. здесь есть окошко для ввода содержимого, отправляемого с консоли. ^Z там не нужен, конец файла - конец данных |
|||
|
||||
alnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 29.11.2012 Репутация: нет Всего: нет |
Спасибо за ссылку, только там все равно не поставить EOF в середину. Я отрабатывал на консоли 8 винды. Сейчас специально попробовал в никсах скопилировать с помощью gcc и запустить на терминале. Там немного иначе получилось: не высвечивается ничего когда ввожу ^D, в середине строки никак не реагирует, но если нажать дважды - реагирует, причем правильно. Почему в винде символ EOF из середины строки не обрабатывается? Возник и другой вопрос =) Почему в unix обрабатывается так странно? Это сообщение отредактировал(а) alnight - 19.11.2013, 23:40 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
alnight, как-то до вас медленно доходит.
если вас интересуют особенности работы в консоли разных ОС, задавайте вопрос об этом. к вашей программе это не имеет ровно никакого отношения. программа правильная и работает верно. если вас интересует обработка нажатия клавиш, это другая тема, решается средствами ОС или сторонних библиотек. Добавлено через 50 секунд в соответствующем разделе, а не С/С++ |
|||
|
||||
alnight |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 29.11.2012 Репутация: нет Всего: нет |
В целом примерно понятно.
Что программа работает правильно я догадывался, она ведь из учебника =) Пытаюсь разобраться в нюансах языка и работы скопмилированного кода с вопросом "а почему именно так". Спасибо за разъяснения. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
"скопмилированный код" не в вакууме находится. программист должен иметь хотя бы общие понятия об устройстве ОС, файловом вводе-выводе, работе пользователя в ОС.
представьте, вы разработали самокат и решили его протестировать на дорогах общего пользования. но ПДД вы не знаете. соседи по потоку вам сигналят, т.к. ваши действия с их точки зрения (и ПДД) неадекватны. вы понимаете, что что-то не так, и начинаете задавать вопросы. но ПДД вы не знаете, поэтому выдаете следствия за причины, и вопросы в стиле "почему самокат так странно едет". |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |