Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2009, 14:59   #1
Achilles
 
Регистрация: 03.03.2009
Сообщений: 5
По умолчанию Getchar bug (?..)

Поясните пожалуйста как работает стандартная функция getchar()?
Имеем такой код:
Код:
Код:
#include <stdio.h>
int main() {
	int i;
	char c;

	printf("Press any key\n");
	for (i = 0; i < 5; i++) {
		c = getchar();
		printf("%c\n");
	}
	return 0;
}
Скомпилирован в MS Visual Studio 2008. Работает так, будто поток stdin буферизован в режиме _IOLBF (вывод происходит лишь после ввода ENTER).
Помоему getchar() не так должна работать. Или я ошибаюсь? Объясните пожалуйста.
Achilles вне форума Ответить с цитированием
Старый 05.03.2009, 15:45   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Читал, что, вроде как, должна работать без enter'а, но на практике всегда приходится его жать.
Поэтому имхо лучше использовать getch(), или getche() для подобной задачи.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.03.2009, 18:09   #3
Achilles
 
Регистрация: 03.03.2009
Сообщений: 5
По умолчанию

Спасибо большое, вот только я про эту функцию ничего не слышал раньше и где она объявлена?
Кстати и компилятор тоже жалуется, говорит, мол, функция не определена, но при этом компилирует всё, и всё работает как надо!
Я ради эксперимента закоментил верхнюю строчку (include), и снова скомпилировал. Компилятор, жалуясь что неопределены функции printf и getch, всё таки выдал мне рабочую программу
Что за фокусы?
Achilles вне форума Ответить с цитированием
Старый 05.03.2009, 18:15   #4
Achilles
 
Регистрация: 03.03.2009
Сообщений: 5
По умолчанию

Да, и вот еще по поводу getchar. Много ли еще подобных сюрпризов меня ожидает в моей дальнейшей программерской практике, когда функции работают не совсем так (а то и совсем не так) как оговаривается во ВСЕЙ (в том числе и последней) литературе? Это все таки немного затрудняет отладку программ, особенно начинающим прогаммистам
Achilles вне форума Ответить с цитированием
Старый 05.03.2009, 18:23   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

для использования getch() и getche() нужно подключить <conio.h>
Цитата:
Я ради эксперимента закоментил верхнюю строчку (include), и снова скомпилировал. Компилятор, жалуясь что неопределены функции printf и getch, всё таки выдал мне рабочую программу
Что за фокусы?
Вот уж действительно фокусы ) Может, просто запустилась программа, скомпилированная до закомменчивания..
Цитата:
Много ли еще подобных сюрпризов меня ожидает в моей дальнейшей программерской практике
К сюрпризам нужно быть готовым всегда ) И если какая-то функция работает не так, как думалось, то лучше ее проверить на каком-нибудь маленьком примере.
"ВСЕЙ" литературы я, увы, не успел прочитать ) В основном, пользуюсь справочниками в интернете. Обычно функции работают так, как заявлено ).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.03.2009, 18:56   #6
Achilles
 
Регистрация: 03.03.2009
Сообщений: 5
По умолчанию

Спасибо, буду знать )
Цитата:
Вот уж действительно фокусы ) Может, просто запустилась программа, скомпилированная до закомменчивания..
Исключено! Лично удалил EXEшник!
Я работаю в MS Visual Studio 2008, эти чудеса ему присущи. Я так подозреваю, что в этой среде есть некая такая возможность, если в коде есть необъявленная функция, то запускается поиск подходящего заголовочного файла и он подключается к коду неявно перед компиляцией. Однако исходник сам не меняется. Если это так, то на мой взгляд майкрософтовцы перестарались, пытаясь облегчить труд простых смертных. Пусть, уж если на то пошло, выдавал бы подсказку, мол, такая-то функция не объявлена в коде, не хотите ли часом подключить такой-то заголовочный файл? А то ведь в других компиляторах этот код не будет компилиться.
Если кому интересно и у кого есть MS Visual Studio 2008, попробуйте проверить мою теорию, а результаты здесь опишите. Прям даж интересно
Achilles вне форума Ответить с цитированием
Старый 05.03.2009, 19:15   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Achilles Я работаю в Dev-C++ и C++ Builder 6.
Сейчас проверил в студии - ругается на неизвестные идентификаторы.
Может, что-нибудь в настройках включить нужно..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.03.2009, 19:49   #8
Achilles
 
Регистрация: 03.03.2009
Сообщений: 5
По умолчанию

Да надо полагать, только скорее отключить. Там же в этих настройках черт ногу сломит (ну по крайней мере для меня пока так , не претендую на знатока MS Visual Studio).
Вот только что создал с нуля новый проект ваще без инклудов, и всё работает )) Выскакивает пара предупреждений (warning), мол, у вас тут две функции не объявлены, а так всё ОК

Последний раз редактировалось Achilles; 05.03.2009 в 19:52.
Achilles вне форума Ответить с цитированием
Старый 06.03.2009, 14:52   #9
Night_Light
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Achilles Посмотреть сообщение
Спасибо, буду знать )

Исключено! Лично удалил EXEшник!
Я работаю в MS Visual Studio 2008, эти чудеса ему присущи. Я так подозреваю, что в этой среде есть некая такая возможность, если в коде есть необъявленная функция, то запускается поиск подходящего заголовочного файла и он подключается к коду неявно перед компиляцией. Однако исходник сам не меняется. Если это так, то на мой взгляд майкрософтовцы перестарались, пытаясь облегчить труд простых смертных. Пусть, уж если на то пошло, выдавал бы подсказку, мол, такая-то функция не объявлена в коде, не хотите ли часом подключить такой-то заголовочный файл? А то ведь в других компиляторах этот код не будет компилиться.
Если кому интересно и у кого есть MS Visual Studio 2008, попробуйте проверить мою теорию, а результаты здесь опишите. Прям даж интересно
Может просто удалил экзешник в другой конфигурации проекта чудес не бывает )
Night_Light вне форума Ответить с цитированием
Старый 06.03.2009, 15:15   #10
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

Код:
Returns the character read. To indicate a read error or end-of-file condition, getc and getchar return EOF, 
and getwc and getwchar return WEOF. For getc and getchar, use ferror or feof to check for an error 
or for end of file.
а по поводу конфига, скорее ты удалил что то не то, например дебаг, а собираешь релиз и тп.
vvviperrr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск