чтение k & r (c book) и запутанный код 1-й главы - PullRequest
0 голосов
/ 10 марта 2011
#include <stdio.h>
/* copy input to output; 2nd version*/
main()
{
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
}

это очень сбивает с толку ... так как вы никогда не выходите из цикла while. Я узнал, что EOF -1. я набираю -1, но он просто перепечатывает Это бесконечный цикл. Со временем библиотека изменилась и отличается от того, что задумывалось в книге? когда я говорю библиотека, я имею в виду putchar () / getchar (), который находится в библиотеке ... извините.

Ответы [ 3 ]

11 голосов
/ 10 марта 2011

Как работает EOF (конец файла)?

EOF - это просто макрос, обозначающий отрицательное значение. Это не должно быть -1. Вы можете указать конец файла из командной строки с помощью управляющего символа, обычно это комбинация ctrl + z для систем Windows или ctrl + d для систем POSIX.

когда вы пишете '-1', вы пишете не ЗНАЧЕНИЕ -1, а строку символов {'-', '1'}

посмотрите здесь .

2 голосов
/ 10 марта 2011

EOF не символ

Это важно.Запомните это.

Когда вы пытаетесь получить персонажа, может произойти несколько вещей.Обычное дело - эффективно читать символ: ваша программа получает этот символ и продолжает свой путь ...

int ch = getchar();

, но что происходит, если происходит сбой диска?или есть плохой сектор именно в этот момент?или сеть выходит из строя?или данных больше нет?
Что ж, тогда должен быть способ отличить эти условия от простых символов.Способ, выбранный C, заключается в возвращении значения, которое НИКОГДА не может быть интерпретировано как реальный символ.Это значение EOF, которое является отрицательным значением (все действительные символы возвращаются со значением, преобразованным в unsigned char, даже если ваша реализация использует signed char для char).Именно поэтому очень важно использовать int для символов (не char, как ожидалось бы).

То есть EOF означает, что невозможно прочитатьперсонаж.Вы можете попытаться выяснить, почему (сеть отключена? Плохой сектор? Конец файла? ...) или просто предположить, что это конец файла, и перейти оттуда.

Итак, в

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

есть две вещи: присваивание и сравнение

c = getchar()

поместит значение 0 или больше в c для реальных символов или EOF в случае ошибки, поэтому

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

означает «пока нет ошибок при вводе символов в переменную c»

Важно помнить:

EOF не является символом .Определите символы с помощью int.

0 голосов
/ 10 марта 2011

После ввода текста нажмите клавишу Enter для новой строки.Затем, удерживая клавишу Ctrl, нажмите клавишу D.

Я работаю над той же книгой.Я думаю, что вы должны просто нажать Ctrl + D, чтобы выйти, но мне сначала нужно было нажать Enter (я думаю, что с моей оболочкой что-то не так).

Кстати, в тексте главы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...