2014-01-29 2 views
0

В 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; 

} 
+0

Возможный дубликат [Что является целью ungetc (или ungetch от K & R)?] (Http://stackoverflow.com/questions/476615/what-is-the-purpose-of-ungetc-or-ungetch- from-kr) – ecatmur

+0

@ecatmur: Это не дубликат этого. Этот вопрос спрашивает, почему используется 'ungetch', а не то, что он делает. –

+0

@EricPostpischil «что есть цель» и «почему он используется», кажется мне одинаковым вопросом. Ваш ответ охватывает ту же самую точку, что и принятый ответ на этот вопрос. – ecatmur

ответ

1

код вы спрашиваете о причинах getint остановиться, если следующий символ в потоке не является частью цифрой (или пробелом), потому что это не цифра или символ знака.

Понятие состоит в том, что до тех пор, пока вы вызываете getint, хотя на входе имеются приемлемые цифры, они преобразуют эти цифры в значения int и возвращают их. Когда вы вызываете getint, пока на входе нет приемлемой цифры, он не будет выполнять преобразование. Поскольку он не выполняет символ, он оставляет символ, который он не использует в потоке.

Правильная процедура вернет сообщение об ошибке, чтобы вызывающий может легко определить, что getint не выполняет преобразование по этой причине. Как бы то ни было, вызывающий не может различать getint, возвращающий 0 для «0» на входе, и getint возвращает 0 для нечислового ввода. Однако, поскольку это только код учебника, такие функции опущены.