В K & R, в начале главы 5, представлена функция GetInt, чтонедоразумение рабочего механизма GetInt функции
выполняет входной преобразование в свободной форме, разбивая поток charachters в целочисленных значений, одно целое за вызов.
Функция довольно прост, но я не могу понять, на самом деле почему c
задвинут в буфер в первом if-statement
. Из-за этого каждый раз, когда вы вызываете getint
, он будет делать то же самое. Потому что он будет читать следующий символ в buffer
, который равен c
. Эта стратегия призвана стать своего рода механизмом безопасности?
int getint(int *pn) {
int c, sign;
while(isspace(c = getch()))
;
if(!isdigit(c) && c != EOF && c != '+' && c != '-') {
ungetch(c);
return 0;
}
sign = (c == '-') ? -1 : 1;
if(c == '+' || c == '-')
c = getch();
for(*pn = 0; isdigit(c); (c = getch()))
*pn = 10 * *pn + (c - '0');
*pn *= sign;
if(c != EOF)
ungetch(c);
return c;
}
Возможный дубликат [Что является целью ungetc (или ungetch от K & R)?] (Http://stackoverflow.com/questions/476615/what-is-the-purpose-of-ungetc-or-ungetch- from-kr) – ecatmur
@ecatmur: Это не дубликат этого. Этот вопрос спрашивает, почему используется 'ungetch', а не то, что он делает. –
@EricPostpischil «что есть цель» и «почему он используется», кажется мне одинаковым вопросом. Ваш ответ охватывает ту же самую точку, что и принятый ответ на этот вопрос. – ecatmur