Good evening. I'm studying the reverse polish calculator of KnR but there are some lines I'm not understanding very well.

Code:#include <stdio.h> #include <stdlib.h> #ifndef MAXOP #define MAXOP 100 #endif #ifndef NUMBER #define NUMBER '0' #endif int getop(char[]); void push(double); double pop(void); int main(void) { int type; double op2; char s[MAXOP]; while( (type = getop(s)) != EOF) { switch(type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '*': push(pop() * pop()); break; case '/': op2 = pop(); if(op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } #define MAXVAL 100 int sp = 0; double val[MAXVAL]; void push(double f) { if(sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if(sp > 0) { return val[--sp]; } else { printf("error: stack empty\n"); return 0.0; } } #include <ctype.h> int getch(void); void ungetch(int); /* getop: get next operator 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) { return (bufp > 0)? buf[--bufp] : getchar(); } void ungetch(int c) { if(bufp >= BUFSIZE) printf("Ungetch: too many characters\n"); else buf[bufp++] = c; }

this section

Why did he insert the null terminator in s[1] ? to stop getting blanks ? after that, did he reset i to overwrite '\0' with an input ? (isdigit(s[++i]) ) ... if so, why did he insert the null terminator in the first place? I don't get it ...Code: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()))