Язык программирования C



         

Область действия - часть 3


} else { /* it's too big; skip rest of line */ while (c != '\n' && c != EOF) c = getchar(); s[lim-1] = '\0'; return (toobig); } }

Что же представляют из себя функции 'getch' и 'ungetch'? Часто так бывает, что программа, считывающая входные данные, не может определить, что она прочла уже достаточно, пока она не прочтет слишком много. Одним из примеров является выбор символов, составляющих число: пока не появится символ, отличный от цифры, число не закончено. Но при этом программа считывает один лишний символ, символ, для которого она еще не подготовлена.

Эта проблема была бы решена, если бы было бы возможно "прочесть обратно" нежелательный символ. Тогда каждый раз, прочитав лишний символ, программа могла бы поместить его обратно в файл ввода таким образом, что остальная часть программы могла бы вести себя так, словно этот символ никогда не считывался. к счастью, такое неполучение символа легко иммитировать, написав пару действующих совместно функций. функция getch доставляет следующий символ ввода, подлежащий рассмотрению; функция ungetch помещает символ назад во ввод, так что при следующем обращении к getch он будет возвращен.

То, как эти функции совместно работают, весьма просто. функция ungetch помещает возвращаемые назад символы в совместно используемый буфер, являющийся символьным массивом. функция getch читает из этого буфера, если в нем что-либо имеется; если же буфер пуст, она обращается к getchar. При этом также нужна индексирующая переменная, которая будет фиксировать позицию текущего символа в буфере.

Так как буфер и его индекс совместно используются функциями getch и ungetch и должны сохранять свои значения в период между обращениями, они должны быть внешними для обеих функций. Таким образом, мы можем написать getch, ungetch и эти переменные как:

#define bufsize 100 char buf[bufsize]; /* buffer for ungetch */ int bufp = 0; /* next free position in buf */

getch() /* get a (possibly pushed back) character */ { return((bufp > 0) ? buf[--bufp] : getchar()); }




Содержание  Назад  Вперед