Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Не понимаю


Автор: MrCorp 4.3.2005, 10:09
Недавно решил заняться изучением Си.
Во многих книгах (в частности "Язык программирования Си" Кернигана и Ритчи) есть такой пример.

#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 4.3.2005, 10:24
Цитата(MrCorp @ 4.3.2005, 10:09)
если пользователь введет символ EOF. Чтобы посмотреть, что это за символ я ввел printf("%d", EOF). Программа мне выдала "-1". И как мне ввести символ с таким кодом?

Ctrl+Z

Цитата(MrCorp @ 4.3.2005, 10:09)
Везде пишут, что функция printf() находится в библиотеке stdio.h. Хотя, когда я удаляю #define <stdio.h>, эту функцию можно использовать.

Видимо, этот заголовок подключается в другом месте. Если у тебя VC, то возможно в stdafx.h или неявно через другие библиотечные функции.

Автор: Borisff2003 4.3.2005, 10:26
getchar() читает символ из стандартного потока ввода, просто пока ты не нажал ENTER у тебя в потоке ничего нет, поэтому getchar() не возвращает управления, после нахатия ENTER в поток помущаются все символы которые ты ввел, цикл по одному их выбирает и печатает на экран (это кстати видно под отладчиком). Конец файла или EOF в данном случае действительно -1, это то что возвращает getchar при конце файла или ошибке. Чтоб набрать его надо нажать Ctrl+Z это кон 26

Автор: Guest 4.3.2005, 10:51
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 4.3.2005, 10:54
Предыдущее сообщение - это мое. Забыл подписаться.

Автор: Goryachev 4.3.2005, 14:07
MrCorp:
Я не понимаю чо непонятного.
У тебя есть цикл. Для каждого ввода с клавы карактера "c" отпечатай его на экран, пока не появится симбол Ctrl+Z. Я думаю теперь понятнее.

Автор: chipset 4.3.2005, 14:14
Модератор: Название темы должно отражать ее суть!

Автор: Guest 5.3.2005, 08:37
Goryachev
Дело в том, что я перешел на Си с Паскаля. А в паскале есть функции readkey и read, которые работают по-иному.
Теперь все начинает проясняться. Но есть еще один непонятный момент.
Код

c = getchar()

Куда заносится введенная с клавиатуры строка? В переменная с содержит только один символ. А где все остальное?

Автор: En_t_end 5.3.2005, 10:15
Цитата
Куда заносится введенная с клавиатуры строка? В переменная с содержит только один символ. А где все остальное?

Все, да и ты сам уже ответили на этот вопрос... в данном случае в входном потоке будут все эти символы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)