Программирование на C: EOF как персонаж - PullRequest
4 голосов
/ 13 октября 2009

При программировании C для командной консоли, что происходит, когда у вас есть функция, которая пытается использовать SCANF, чтобы запросить пользовательский ввод для переменной CHAR, и пользователь набирает CTRL + Z (EOF) и попадания вводят?

Например:

char promptChar()
{
    char c;
    printf("Enter a character: ");
    scanf("%c", &c);
    return c;
}

Если пользователь наберет CTRL + Z и нажмет ввод, что вернет promptChar ()? Потому что, если я понимаю EOF, это int.

Ответы [ 3 ]

11 голосов
/ 13 октября 2009

Перво-наперво:

SCANF не определяется языком.
CHAR не определяется языком.

Хорошо, со всем этим ...

Функция scanf() возвращает целое число. Это целое число - количество назначенных элементов ввода или значение макроса EOF, если перед первым преобразованием произошел сбой ввода.
Вы не проверяли возвращаемое значение вызова scanf(), поэтому не знаете, что произошло. Возможно, все работало нормально, или поток ввода мог завершиться до первого преобразования, или (не для% c), возможно, произошел сбой преобразования.

Проверьте возвращаемое значение scanf(). Действительно, всегда проверяет возвращаемое значение всех функций .

char ch;
int result = scanf("%c", &ch);
if (result == 1) /* all ok */;
else if (result == 0) /* conversion failure: value of `ch` is indeterminate */;
else if (result == EOF) /* input failure; value of `ch` is indeterminate */;

Если результатом вызова scanf() является EOF, если вам нужна дополнительная информация о причине сбоя ввода, вы можете использовать feof() и / или ferror().

else if (result == EOF) {
    if (feof(stdin)) {
        /* no data in input stream */
    }
    if (ferror(stdin)) {
        /* error if input stream (media ejected? bad sector? ...?)
    }
}

Чтобы ответить на ваш вопрос: what will promptChar() return?

Возвращает неопределенное значение типа char.
Вы можете последовать примеру библиотечной функции, которая работает с символами и вернуть int из promptChar(). Это будет значение прочитанного символа, приведенное к unsigned char или отрицательное значение int (EOF) в случае ошибки. Прочитайте описание для fgetc(), например.

4 голосов
/ 13 октября 2009

Из справочной страницы Linux scanf(3):

"Значение EOF возвращается, если достигнут конец ввода перед первым успешным преобразованием или ошибкой сопоставления. EOF также возвращается при возникновении ошибки чтения, в этом случае устанавливается индикатор ошибки для потока (см. ferror(3)), а значение errno указывает на ошибку. "

Обратите внимание, что этот отрывок касается возвращаемого значения scanf, а не параметров результата.

0 голосов
/ 13 октября 2009

Это зависит от используемой командной оболочки, но вам не следует разрабатывать какую-либо программу, ожидающую чтения управляющих символов из интерактивного приглашения.

Большинство командных оболочек перехватывают некоторые управляющие символы и используют их, чтобы заставить оболочку что-то делать. Например, ctrl-s и ctrl-q часто запускают и останавливают отображение оболочки выходных символов. Ctrl-z на некоторых оболочках фактически будет восприниматься как команда для выключения оболочки.

...