Изучаю язык программирования C по книге "Язык программирования Си" (Книга, Брайан Керниган и Деннис Ритчи). Остановился на теме: 1.5.1. Копирование файлов, так вот до этой темы всё было понятно и все упражнения делал. Объясните максимально понятно программу:
#include
main ()
{
int c;
c = getchar() ;
while (c != EOF) {
putchar (c) ;
c = getchar () ;
}
}
Не понятен именно этот момент -
c = getchar() ;
while (c != EOF) {
putchar (c) ;
c = getchar () ;
Что значит функция getchar(); почему говориться что она читает один символ? как это читает? как один, если я могу ввести много символов? приведите пример какой-нибудь ?
и также с другой функцией putchar (c) ; что это вообще? и вот этот цикл (c != EOF), что EOF причем тут он? как программа работает объясните, как они взаимодействуют. Очень сильно буду благодарен кто объяснить мне данную тему)
Другие языки программирования и технологии
Язык программирования Си
То, что ты вводишь с клавиатуры, попадает в специальный системный буфер. И становится доступно для программы, как только ты нажмёшь Enter.
А getchar читает из этого буфера по одному символу. Если буфер пуст - ждёт, пока ты что-то введёшь и нажмёшь Enter.
getchar вводит 1 БАЙТ (код символа от 0 до 255). Но, обрати внимание, переменная c объявлена как int - и это ОБЯЗАТЕЛЬНОЕ условие.
Когда файл заканчивается (в случае консольного ввода с клавиатуры нажаты Ctrl+Z и Enter), getchar начинает возвращать не коды символов, а специальное значение, равное константе EOF, ОТЛИЧНОЕ от кода любого символа (обычно это значение -1). И это означает, что данных больше нет и не будет.
Потому когда значение c становится равным EOF, цикл заканчивается.
А getchar читает из этого буфера по одному символу. Если буфер пуст - ждёт, пока ты что-то введёшь и нажмёшь Enter.
getchar вводит 1 БАЙТ (код символа от 0 до 255). Но, обрати внимание, переменная c объявлена как int - и это ОБЯЗАТЕЛЬНОЕ условие.
Когда файл заканчивается (в случае консольного ввода с клавиатуры нажаты Ctrl+Z и Enter), getchar начинает возвращать не коды символов, а специальное значение, равное константе EOF, ОТЛИЧНОЕ от кода любого символа (обычно это значение -1). И это означает, что данных больше нет и не будет.
Потому когда значение c становится равным EOF, цикл заканчивается.
eof это флаг конца файла. он устанавливается когда при прочтении файла буфер потока становится равным 0.
getchar() считывает 1 символ из ВХОДЯЩЕГО потока. поток может быть еще и на ВЫХОД.
так если например вы будете вводить символы когда потребуется ввести число, чтобы входящий поток был чем то забит, а после восстановите, то сможете посимвольно прочитать то что находится в востановленном входящем потоке. отличный пример который это демострирует:
int var;
printf("var = ");
scanf("%d", &var); // Здесь вводим какое то предложение и получаем ошибочный поток..
clear(); // Снимаем флаг ошибки с потока, делаем его безошибочным..
char ch = getchar();
printf("%c", ch);
while(ch != EOF){// пока буфер входящего потока не будет равен нулю...
ch = getchar(); // по символьно считываем из потока
printf("%c", ch); // и выводим на экран...
_getch(); // Для большего понимания остановим программу. (нужно подключить conio.h)
}
getchar() считывает 1 символ из ВХОДЯЩЕГО потока. поток может быть еще и на ВЫХОД.
так если например вы будете вводить символы когда потребуется ввести число, чтобы входящий поток был чем то забит, а после восстановите, то сможете посимвольно прочитать то что находится в востановленном входящем потоке. отличный пример который это демострирует:
int var;
printf("var = ");
scanf("%d", &var); // Здесь вводим какое то предложение и получаем ошибочный поток..
clear(); // Снимаем флаг ошибки с потока, делаем его безошибочным..
char ch = getchar();
printf("%c", ch);
while(ch != EOF){// пока буфер входящего потока не будет равен нулю...
ch = getchar(); // по символьно считываем из потока
printf("%c", ch); // и выводим на экран...
_getch(); // Для большего понимания остановим программу. (нужно подключить conio.h)
}
мне кажется
getchar = получить букву
тоесть
с=получить букву ();
пока (с не равно ЕOF){
выдать (с);
с = получить букву ();
getchar = получить букву
тоесть
с=получить букву ();
пока (с не равно ЕOF){
выдать (с);
с = получить букву ();
Станислав Калиберда
так можно ведь не одну букву и число, и не только одно? и что значит (C не равно EOF)
вы почти ответили на мой вопрос
вы почти ответили на мой вопрос
зачем тебе си, начинай с c#, он только популярнее становится + с ним ты всё что угодно с легкостью сделаешь, там все формы, кнопки, множество функций за тебя всё сделано и тебе только надо уметь применить.
Станислав Калиберда
Знаешь C - знаешь как всё работает. Он напрямую работает с памятью компьютера.
Начну с C, потом C++, и С#
Начну с C, потом C++, и С#
Станислав Калиберда
Ответь если знаешь? пж
Alisher Tashmatov
C# не становится популярнее. Насколько знаю, его рейтинг вообще не меняется. Но язык хороший, легкий. И пацан правильно говорит. Надо начинать с C, потом C++, потом более высокоуровневые языки
ps: простите за такое кривое использование таких терминов как Xуровневый, но я не знаю как сказать по-другому
ps: простите за такое кривое использование таких терминов как Xуровневый, но я не знаю как сказать по-другому
getchar() - получает один символ
putchar() - (вроде) выводит символ
Работает все так:
Программа ждет символ и записывает в переменную "c" (пока она не получит символ, код дальше не выполняется)
Символ получен, идем дальше
Цикл, пока "c" не станет равен EOF:
Выводим "c" в консоль
Программа ждет символ и записывает в переменную "c" (пока она не получит символ, код дальше не выполняется)
Код повторяется
putchar() - (вроде) выводит символ
Работает все так:
Программа ждет символ и записывает в переменную "c" (пока она не получит символ, код дальше не выполняется)
Символ получен, идем дальше
Цикл, пока "c" не станет равен EOF:
Выводим "c" в консоль
Программа ждет символ и записывает в переменную "c" (пока она не получит символ, код дальше не выполняется)
Код повторяется
Станислав Калиберда
Уже понимаю, но что такое EOF чему равно? EOF это что вообще значит? и почему цикл повторяется? и можно ведь вести доФИга символом, а говориться что getchar считывает один символ? чё у меня думки не догоняю?
c = getchar() ;
while (c != EOF) {
putchar (c) ;
c = getchar () ;
getchar получает один символ putchar помещает символ в поток вывода stdout и так до тех пор пока не достигнет конец файла EOF константа -1 пока веденный символ не является -1 запрашивать символ повторно в UNIX системах для указания EOF в терминале используется CTRL+D
для краткости можно написать вот так
char c;
while((c = getchar()) != EOF)
putchar(c);
while (c != EOF) {
putchar (c) ;
c = getchar () ;
getchar получает один символ putchar помещает символ в поток вывода stdout и так до тех пор пока не достигнет конец файла EOF константа -1 пока веденный символ не является -1 запрашивать символ повторно в UNIX системах для указания EOF в терминале используется CTRL+D
для краткости можно написать вот так
char c;
while((c = getchar()) != EOF)
putchar(c);
Похожие вопросы
- Как на языке программирования си сделать, чтобы при вводе полного бреда программа не поломалась?
- Как в языке программирования СИ осуществлять вызов подпрограммы, которая находится в другом файле?
- Ребята, скажите где можно скачать язык программирования Си, без ++
- Помогите пожалуйста решить задачу по программированию (язык программирования СИ)
- Помогите пожалуйста найти ошибку в задаче (Язык программирования Си)
- Как на языке программирования Си убрать конкретный напечатанный элемент массива или напечатать его в определенном месте?
- Кто знает язык программирования Си++? Можно ли вывести текст по другому?
- Массивы данных на языке программирования СИ.
- Оконное приложение на WinAPI, вопрос про параметры функции WndProc. Язык программирования Си.
- А какие языки программирования изучали в 80х и на чём вы их изучали?
Подскажите пожалуйста чем отличаются версии книги Никлауса Вирта Алгоритмы и структуры данных с Обероном и Паскалем?