на getchar() - ведет себя совсем не так, как следует из учебника.
Первое - учебник утверждает, что эта функция предназначена для чтения одного символа. Однако, если ввести один символ, ничего не происходит до тех пор, пока не нажмешь клавишу Энтер.
Второе - в учебнике много важных примеров содержат строчку
while ((с = getchar()) != EOF). Попытки define EOF 0, или -1 ничего не дают, если при выполнении программы ввести -1, это будет воспринято не как EOF, а как еще один символ. Решить проблему получилось только введенением Ctrl+Z (Code::Blocks/Windows).
Что можно использовать как EOF для Windows?
Третье - простейшая программа учета количества символов, введенных с клавиатуры, считает количество символов в двойном размере, ИМХО считает количество нажатий Enter. Тут уже налицо то, что я глобально не понимаю, как работает getchar().
Или может вообще не стоит лезть в детальный разбор функции getchar()? Смущает то, что очень много примеров идет с ее использованием, и такие, что неверное понимание работы getchar() ломает всю логику программы.
Любые советы/критика и т. п. приветствуются!
Спасибо!
Другие языки программирования и технологии
Си, getchar() Изучаю самостоятельно Си, сейчас пытаюсь читать Кернигана и Ритчи (3-ье издание). Буксую конкретно
Ну дык, и в документации по getchar() написано, что она блокируется до ввода [Ctrl]+C или "\0". Функции стандартного ввода/вывода предназначены для работы с потоками. Нужен опрос клавиатуры - используй nCurses.
Как я понимаю, консоль в Си так устроена, что текст не передаётся в стандартный ввод программы, пока не нажмёшь клавишу Ввод. Ты можешь ввести сразу много символов и нажать Ввод: getchar вернёт эти символы один за другим, и ещё вернёт служебный символ "конец строки".
"-1" введённый с клавиатуры, это 2 символа: минус и единица. Не путай символы и их коды. Код символа '1' равен 49, а не 1. Код -1 - это специальный код для обозначения конца файла. Символа с таким кодом быть не может. Ctrl+Z - это способ эмитировать "конец файла" при вводе в консоли.
Создай текстовый файл с входными данными и запускай программу так:
myApp1 << input.txt
тут myApp1 - имя exe-файла, input.txt - файл входных данных.
"-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;
}
У меня тоже были мысли, что возмжно 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 который ничему не присваиваешь.
Сергей L
Спасибо! Да, то меня тоже дошло, что учитывается и символ, и Enter.
Меня смутило то, что примеры такие даны в учебнике Кернигана и Ритчи.
Может быть такое, что на момент написания книги при вводе с клавиатуры getchar() брал один символ?
Меня смутило то, что примеры такие даны в учебнике Кернигана и Ритчи.
Может быть такое, что на момент написания книги при вводе с клавиатуры getchar() брал один символ?
буксуй буксуй только не сдавайся далеко пойдешь!
почитай ловушка EOF загугли обязательно прочитай если ты до сих пор ничего не понял про eof.
почитай ловушка EOF загугли обязательно прочитай если ты до сих пор ничего не понял про eof.
>ведет себя совсем не так, как следует из учебника.
Это ты не способен понимать прочитанное.
>ввести -1
Это два символа
>Что можно использовать как EOF для Windows?
Перенаправление потоков, EOF = конец файла.
Хорошая IDE для Си на винду это Pelles C.
Это ты не способен понимать прочитанное.
>ввести -1
Это два символа
>Что можно использовать как EOF для Windows?
Перенаправление потоков, EOF = конец файла.
Хорошая IDE для Си на винду это Pelles C.
Сергей L
Спасибо!
Pelles уже качаю и попробую, спасибо!
Буду использовать файлы в качестве потока ввода, даже как временная мера, чтоб не застревать на одном месте - полезно.
Но все равно хочу разобраться с вводом с клавиатуры.
Про то, что дело в том, что я торможу, а не в учебнике - понятно, просто были еще варианты, что может компилятор поменялся с тех пор, как книга Кернигана и Ритчи вышла, или что перевели коряво. значит, дело во мне, спасибо!
Pelles уже качаю и попробую, спасибо!
Буду использовать файлы в качестве потока ввода, даже как временная мера, чтоб не застревать на одном месте - полезно.
Но все равно хочу разобраться с вводом с клавиатуры.
Про то, что дело в том, что я торможу, а не в учебнике - понятно, просто были еще варианты, что может компилятор поменялся с тех пор, как книга Кернигана и Ритчи вышла, или что перевели коряво. значит, дело во мне, спасибо!
Похожие вопросы
- Изучаю самостоятельно Си в CodeBlocks под Windows. Посоветуйте, пожалуйста, альтернативную IDE для изучения Си?
- Язык Си. Нужна методичка хорошая, в которой на примерах и глубоко обьясняются основы. Например, сейчас буксую на
- Как заставить себя, изучать язык си?
- Учу самостоятельно Си как первый язык.
- Какой СИ. Какой СИ лучше? си плюс плюс или си шарп? что стоит учить в первую очередь?
- сильно ли си шарп отличается от си. а то очень охота си изучить, но там какита указатели и какита >
- язык си. задача по языку Си. Задаются коэффициенты системы из трёх линейных уравнений. Найти корни.
- Что сейчас из себя представляет чистый Си? Что пишут на Си? Если пишут, то почему не на С++?
- Стоит ли изучать Си-шарп?
- НЕбольшие вопросики по Си. Ребят, помогите пока желание изучать не угасло
А может такое быть, что в более ранних версиях компиляторов такие программы работали так, как пишет Керниган и Ритчи? Год издания книги непонятный, может с новыми стандартами тот же код работает по другому?
Пока иду разбираться с nCurses.