![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
MrCorp |
|
|||
Unregistered |
Недавно решил заняться изучением Си.
Во многих книгах (в частности "Язык программирования Си" Кернигана и Ритчи) есть такой пример. #include <stdio.h> main() { int c; while ((c = getchar() != EOF) putchar© } К сожалению, объяснений, как работает эта программа очень мало. А я очень хочу понять, как же это работает. Я и под отладчиком по шагам программу выполнял и менял ее по-всякому и справку всю перерыл. Помогите, пожалуйста, мне понять этот пример. Вот мои вопросы. 1. Вот как я понимаю работу этой программы. Сначала выполняется функция getchar(), которая считывает считывает символы с клавиатуры, заканчивает свою работу данная функция после нажатия ENTER. Затем переменной c присваивается значение первого введенного символа. После чего значение переменной с проверяется с EOF и если не равно, то выполняется putchar©, которая выводит этот символ на экран. Судя по этой логике, если пользователь введет строку например "asd", должно отобразиться только "a". А программа отображает всю строку. Почему? Где хранятся остальные символы? 2. Цикл while в данной программе завершается, если пользователь введет символ EOF. Чтобы посмотреть, что это за символ я ввел printf("%d", EOF). Программа мне выдала "-1". И как мне ввести символ с таким кодом? Сколько я ни старался, ничего у меня не получилось. 3. Везде пишут, что функция printf() находится в библиотеке stdio.h. Хотя, когда я удаляю #define <stdio.h>, эту функцию можно использовать. |
|||
|
||||
DENNN |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Ctrl+Z
Видимо, этот заголовок подключается в другом месте. Если у тебя VC, то возможно в stdafx.h или неявно через другие библиотечные функции. Это сообщение отредактировал(а) DENNN - 4.3.2005, 10:25 |
||||
|
|||||
Borisff2003 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 198 Регистрация: 26.2.2004 Где: г. Уфа Репутация: 1 Всего: 1 |
getchar() читает символ из стандартного потока ввода, просто пока ты не нажал ENTER у тебя в потоке ничего нет, поэтому getchar() не возвращает управления, после нахатия ENTER в поток помущаются все символы которые ты ввел, цикл по одному их выбирает и печатает на экран (это кстати видно под отладчиком). Конец файла или EOF в данном случае действительно -1, это то что возвращает getchar при конце файла или ошибке. Чтоб набрать его надо нажать Ctrl+Z это кон 26
--------------------
Лень, двигатель прогресса |
|||
|
||||
Guest |
|
|||
Unregistered |
1. Borisff2003. Да, я под отладчиком тоже это заметил. Вопрос такой. Функция putchar( c ) печатает содержимое переменной c. Первый символ в переменную c заносится функцией getchar(). А второй? Третий?
Единственное объяснение, которое мне приходит на ум, следующее. Функция getchar() запрашивает ввод с клавиатуры, если поток пуст. Если поток не пуст, то эта функция удаляет первый символ в потоке, тем самым уменьшая размер на 1. И возвращает следующий за удаленным символ. И так до тех пор, пока поток не будет пуст. 2. Спасибо. Все понятно. Все работает 3. Написал тестовую программу main() { printf("Test\n"); } Скомпилировалась без ошибок на следующих компиляторах TurboC 2.0, QC 2.1 и Borland C++ 5.02 (если компилировать файл *.c). А если создать файл *.cpp, то Borland C++ 5.02 выдает ошибку и ругается на функцию printf(). Borisff2003 |
|||
|
||||
MrCorp |
|
|||
Unregistered |
Предыдущее сообщение - это мое. Забыл подписаться.
|
|||
|
||||
Goryachev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
MrCorp:
Я не понимаю чо непонятного. У тебя есть цикл. Для каждого ввода с клавы карактера "c" отпечатай его на экран, пока не появится симбол Ctrl+Z. Я думаю теперь понятнее. |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Модератор: Название темы должно отражать ее суть!
--------------------
|
|||
|
||||
Guest |
|
|||
Unregistered |
Goryachev
Дело в том, что я перешел на Си с Паскаля. А в паскале есть функции readkey и read, которые работают по-иному. Теперь все начинает проясняться. Но есть еще один непонятный момент.
Куда заносится введенная с клавиатуры строка? В переменная с содержит только один символ. А где все остальное? |
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Все, да и ты сам уже ответили на этот вопрос... в данном случае в входном потоке будут все эти символы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |