powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / непонятки с getchar()(VC ++ 2005)
10 сообщений из 10, страница 1 из 1
непонятки с getchar()(VC ++ 2005)
    #34634642
Хрякер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
штудирую K&R и C
такой код из книги:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include<stdio.h>

void main()
{
	int c;
	while((c=getchar())!=EOF)
	{
		putchar(c);
	}
}

Поидее getchar должен ждать символ,
если он не EOF, то выполняется putchar,
если EOF - выход из while.

Но все работает не так!??

Например я ввожу строку ddddddd,
управление на putchar не пердается пока я не нажму ентер
и на экране печатается ddddddd
когда я нажимаю ентер передается управление на путчар
и повторно выводится ddddddd
(что переменная с типа int c содержит строку из нескольких символов ???)
далее управление снова передпается на гетчар
(как? я ведь нажал ентер)
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634693
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, у тебя цикл выполняется несколько раз. В этом ты можешь убедиться установив дополнительный вывод на экран при каждой иттерации.

Дело в том что поток ввода буферизуется, и буфер не будет поступать в getchar() пока не будет нажат enter.
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634698
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я точно уже не помню.
Вообще функция getchar не завершается пока не нажат enter. Операционная система хранит вводимую строку в буфере до тех пор пока не будет нажат enter, после того как enter нажат getchar получает этот буфер, и считывает из него по одному символу. Поэтому цикл начинает работать потом, и все символы выводятся после enter-a. И то что ты нажал enter, ето не значит что стандартный входной файл закончился, система читает в буфер следующую строку. Вот единственное чего я не знаю, это как из консоли ввести EOF
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634726
Хрякер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но пример взят из книги
Брайан В. Керниган, Деннис М. Ритчи
и по описанию из нее пример должен работать так :

Цикл while, пересылая в c полученное от getchar значение, сразу же проверяет: не является ли оно “концом файла”. Если это не так, выполняется тело цикла while и печатается символ. По окончании ввода завершается работа цикла while, а тем самым и main.
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634755
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХрякерНо пример взят из книги
Брайан В. Керниган, Деннис М. Ритчи
и по описанию из нее пример должен работать так :

Цикл while, пересылая в c полученное от getchar значение, сразу же проверяет: не является ли оно “концом файла”. Если это не так, выполняется тело цикла while и печатается символ. По окончании ввода завершается работа цикла while, а тем самым и main.

Все правельно. Здесь не описано, что функция getchar должна возвращать этот символ сразу же после того, как его ввел пользователь.
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634756
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХрякерНо пример взят из книги
Брайан В. Керниган, Деннис М. Ритчи
и по описанию из нее пример должен работать так :

Цикл while, пересылая в c полученное от getchar значение, сразу же проверяет: не является ли оно “концом файла”. Если это не так, выполняется тело цикла while и печатается символ. По окончании ввода завершается работа цикла while, а тем самым и main.

Он так и работает, он ОС буферезует ввод из консоли. И конца файла (EOF) в консоли нет, это бесконечный файл.

Я сам довольно долго мучился не мог понять в чем дело.
Когда я откомпилировал эту прогу в линуксе, и запустил, перенаправив поток ввода, чтоб он шел из файла, то получил результат в точности соответствующий тому что описано в книге
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634802
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрякер пишет:

> Например я ввожу строку ddddddd,
> управление на putchar не пердается пока я не нажму ентер

Правильно, так и должно быть. Буферизированный ввод, называется.
getchar() читает из буфера входного потока ОДИН символ, но как
эти символы попадают в буфер - это не его дело, а операционной
системы. А операционка вводит только строками.

> и на экране печатается ddddddd
> когда я нажимаю ентер передается управление на путчар
> и повторно выводится ddddddd

Ты видимо спутал с функциями getch()/putch(), они небуферизированные,
но и нестандартные.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634814
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрякер пишет:

> Цикл while, пересылая в c полученное от getchar значение, сразу же
> проверяет: не является ли оно “концом файла”. Если это не так,
> выполняется тело цикла while и печатается символ. По окончании ввода
> завершается работа цикла while, а тем самым и main.

Так так все и работает!! Только еще ввод из OS вмешивается в процесс,
а он в книге не описан.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634818
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_K пишет:
> Он так и работает, он ОС буферезует ввод из консоли. И конца файла (EOF)
> в консоли нет, это бесконечный файл.

Ну да уж, сказки-то не надо рассказывать. Ctrl-Z нажимаешь, и вот он, конец
файла CON.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
непонятки с getchar()(VC ++ 2005)
    #34634825
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Sandro_K пишет:
> Он так и работает, он ОС буферезует ввод из консоли. И конца файла (EOF)
> в консоли нет, это бесконечный файл.

Ну да уж, сказки-то не надо рассказывать. Ctrl-Z нажимаешь, и вот он, конец
файла CON.
Posted via ActualForum NNTP Server 1.4
Спасибо, не знал, просто давно когда-то я тож с этим примером мучился
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / непонятки с getchar()(VC ++ 2005)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]