Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не понимаю, не понимаю, как работает программа 
:(
    Опции темы
MrCorp
Дата 4.3.2005, 10:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 4.3.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата(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 или неявно через другие библиотечные функции.

Это сообщение отредактировал(а) DENNN - 4.3.2005, 10:25
PM ICQ   Вверх
Borisff2003
Дата 4.3.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 26.2.2004
Где: г. Уфа

Репутация: 1
Всего: 1



getchar() читает символ из стандартного потока ввода, просто пока ты не нажал ENTER у тебя в потоке ничего нет, поэтому getchar() не возвращает управления, после нахатия ENTER в поток помущаются все символы которые ты ввел, цикл по одному их выбирает и печатает на экран (это кстати видно под отладчиком). Конец файла или EOF в данном случае действительно -1, это то что возвращает getchar при конце файла или ошибке. Чтоб набрать его надо нажать Ctrl+Z это кон 26
--------------------
Лень, двигатель прогресса
PM MAIL WWW ICQ   Вверх
Guest
Дата 4.3.2005, 10:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 4.3.2005, 10:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Предыдущее сообщение - это мое. Забыл подписаться.
  Вверх
Goryachev
Дата 4.3.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

Репутация: нет
Всего: нет



MrCorp:
Я не понимаю чо непонятного.
У тебя есть цикл. Для каждого ввода с клавы карактера "c" отпечатай его на экран, пока не появится симбол Ctrl+Z. Я думаю теперь понятнее.
PM MAIL   Вверх
chipset
Дата 4.3.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Guest
Дата 5.3.2005, 08:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

c = getchar()

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



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

Все, да и ты сам уже ответили на этот вопрос... в данном случае в входном потоке будут все эти символы.
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.