2015-05-25 4 views
2
int getch(void); 
void ungetch(int); 
/* getop: get next character or numeric operand */ 
int getop(char s[]) 
{ 
    int i, c; 
    while ((s[0] = c = getch()) == ' ' || c == '\t') 
    ; 
    s[1] = '\0'; 
    if (!isdigit(c) && c != '.') 
    return c; /* not a number */ 
    i = 0; 
    if (isdigit(c)) /* collect integer part */ 
    while (isdigit(s[++i] = c = getch())) 
    ; 
    if (c == '.') /* collect fraction part */ 
    while (isdigit(s[++i] = c = getch())) 
     ; 
    s[i] = '\0'; 
    if (c != EOF) 
    ungetch(c); 
    return NUMBER; 
} 
#define BUFSIZE 100 
char buf[BUFSIZE]; /* buffer for ungetch */ 
int bufp = 0;  /* next free position in buf */ 

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

void ungetch(int c) /* push character back on input */ 
{ 
    if (bufp >= BUFSIZE) 
     printf("ungetch: too many characters\n"); 
    else 
     buf[bufp++] = c; 
} 

Приведенный выше код от K & Р.Уточнение в объявлении массива

В приведенном выше коде, я вижу массив buf[] используется для максимального индекса 1, но определяется как размер 100. Является ли определение «ОК» или существует огромная потеря памяти?

Я в значительной степени думаю, что это плохой стиль программирования.

Я прошу getop() Func, а не для общего Геч() и ungetch()

Я новичок, и я извиняюсь, если мой вопрос неверен: P

+2

"* Я вижу, что массив buf [] используется с максимальным индексом 1 *" - Где? –

+3

Что делать, если вы вызываете 'ungetch' 2 или более раз? Так нет, это не пустая трата памяти? Это позволяет вернуть все символы обратно в буфер. –

+0

Mohit Jain и Cool Guy, простите меня за то, что вы не публикуете полный код. Теперь он обновляется с полным кодом – ThunderPunch

ответ

1

Не считая «стиль программирования», это функции без каких-либо действий для их запуска (то есть функция main). Таким образом, вы не можете сказать, как эти будут использоваться, но вы можете понять, как они могут быть использованы. Теперь предположим, что ungetch вызывается в цикле, без вызова getch. На каждой итерации bufp вырастет на 1, а buf будет медленно заполняться до точки, где bufp равно BUFSIZE, и будет напечатано «слишком много символов». Затем, если getch вызывается в цикле ПОСЛЕbuf заполнен, bufp будет сокращаться на 1 для каждой итерации до buf, и getchar будет использоваться для следующего символа.

+0

Да, на самом деле используется весь буфер, или он может использоваться в зависимости от того, как 'getch' и' ungetch' и вызываются. Утверждение OP о том, что используются только два байта, неверно. –

Смежные вопросы