Другие языки программирования и технологии

Си, getchar() Изучаю самостоятельно Си, сейчас пытаюсь читать Кернигана и Ритчи (3-ье издание). Буксую конкретно

на getchar() - ведет себя совсем не так, как следует из учебника.
Первое - учебник утверждает, что эта функция предназначена для чтения одного символа. Однако, если ввести один символ, ничего не происходит до тех пор, пока не нажмешь клавишу Энтер.
Второе - в учебнике много важных примеров содержат строчку
while ((с = getchar()) != EOF). Попытки define EOF 0, или -1 ничего не дают, если при выполнении программы ввести -1, это будет воспринято не как EOF, а как еще один символ. Решить проблему получилось только введенением Ctrl+Z (Code::Blocks/Windows).
Что можно использовать как EOF для Windows?
Третье - простейшая программа учета количества символов, введенных с клавиатуры, считает количество символов в двойном размере, ИМХО считает количество нажатий Enter. Тут уже налицо то, что я глобально не понимаю, как работает getchar().
Или может вообще не стоит лезть в детальный разбор функции getchar()? Смущает то, что очень много примеров идет с ее использованием, и такие, что неверное понимание работы getchar() ломает всю логику программы.
Любые советы/критика и т. п. приветствуются!
Спасибо!
Сергей L
Сергей L
15 714
Ну дык, и в документации по getchar() написано, что она блокируется до ввода [Ctrl]+C или "\0". Функции стандартного ввода/вывода предназначены для работы с потоками. Нужен опрос клавиатуры - используй nCurses.
Денис Агулов
Денис Агулов
26 548
Лучший ответ
Сергей L Спасибо огромное за ответ!
А может такое быть, что в более ранних версиях компиляторов такие программы работали так, как пишет Керниган и Ритчи? Год издания книги непонятный, может с новыми стандартами тот же код работает по другому?
Пока иду разбираться с nCurses.
Как я понимаю, консоль в Си так устроена, что текст не передаётся в стандартный ввод программы, пока не нажмёшь клавишу Ввод. Ты можешь ввести сразу много символов и нажать Ввод: getchar вернёт эти символы один за другим, и ещё вернёт служебный символ "конец строки".

"-1" введённый с клавиатуры, это 2 символа: минус и единица. Не путай символы и их коды. Код символа '1' равен 49, а не 1. Код -1 - это специальный код для обозначения конца файла. Символа с таким кодом быть не может. Ctrl+Z - это способ эмитировать "конец файла" при вводе в консоли.

Создай текстовый файл с входными данными и запускай программу так:
myApp1 << input.txt
тут myApp1 - имя exe-файла, input.txt - файл входных данных.
Сергей L Спасибо!
У меня тоже были мысли, что возмжно getchar() читает строку до нажатия Ввод. Но вот КУДА можно вернуть эти символы, не приложу ума. В массив?
Вот такая незаконченная программка получилась, два вопроса у меня.
1. можно ли в массив вернуть эти символы?
2. что тогда должно быть в правой части выражения ch[i] = ...
Спасибо огромное!!!
#include

int main()
{
char ch[50] ;
int i;

while (( c= getchar())!= EOF)

{
for(i=0;i<10;i++)
{
ch[i] = //???
}
}
return 0;
}
С двойным учетом символов над понимать что при вводе с консоли учитывается не только введенный символ, но и символ от нажатия Enter символ перевода строки '\n', то есть и после scanf и после getchar и некоторых других поток ввода надо как-то очищать - то есть забрать из потока этот '\n', самый простой вариант ещё один getchar который ничему не присваиваешь.
Андрей Брусков
Андрей Брусков
11 032
Сергей L Спасибо! Да, то меня тоже дошло, что учитывается и символ, и Enter.
Меня смутило то, что примеры такие даны в учебнике Кернигана и Ритчи.
Может быть такое, что на момент написания книги при вводе с клавиатуры getchar() брал один символ?
буксуй буксуй только не сдавайся далеко пойдешь!
почитай ловушка EOF загугли обязательно прочитай если ты до сих пор ничего не понял про eof.
>ведет себя совсем не так, как следует из учебника.
Это ты не способен понимать прочитанное.

>ввести -1
Это два символа

>Что можно использовать как EOF для Windows?
Перенаправление потоков, EOF = конец файла.

Хорошая IDE для Си на винду это Pelles C.
Сергей L Спасибо!
Pelles уже качаю и попробую, спасибо!

Буду использовать файлы в качестве потока ввода, даже как временная мера, чтоб не застревать на одном месте - полезно.
Но все равно хочу разобраться с вводом с клавиатуры.

Про то, что дело в том, что я торможу, а не в учебнике - понятно, просто были еще варианты, что может компилятор поменялся с тех пор, как книга Кернигана и Ритчи вышла, или что перевели коряво. значит, дело во мне, спасибо!