Reverse Polish Calcullator

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

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()))

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 ...