所以我一直通過K個& [R書打算在過去幾個星期。我已經完成了所有的工作,沒有真正跳過。如果我遇到困難,我通常可以通過google例子找到答案,但這一次,我一直難住。K&R C練習4-11,靜態變量
4.6節涉及聲明靜態變量,外部和內部。演習這樣說:
練習4-11。修改getop,使其不需要使用ungetch。提示:使用內部靜態變量。
這與波蘭計算器做。 getop收集下一個運算符或操作數,ungetch將字符推回到輸入堆棧上。
原有的功能如下:
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.' && c != '-')
return c; /* not a number */
i = 0;
if (c == '-') {
if (isdigit(c = getchar())) {
s[i] = '-';
ungetch(c);
}
else {
ungetch(c);
return '-';
}
}
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect a fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
大多數例子,我擡頭一看這個樣子的:
static int buf = EOF;
if (buf != EOF && buf != ' ' && buf != '\t'
&& !isdigit(buf) && buf != '.') {
c = buf;
buf = EOF;
return c;
}
if (buf == EOF || buf == ' ' || buf == '\t')
while ((*s = c = getch()) == ' ' || c == '\t')
;
else
*s = c = buf;
buf = EOF;
我的問題是沒有考慮到我們的修改應該早些時候做出getop,這是處理負數。我發現的這些例子都沒有用到這個變量是靜態的,因此在函數被調用後仍然存在。我們最後將它設置爲EOF。如果函數調用之間的變量無關緊要,爲什麼要使用靜態變量?
最後,我不知道如何使用靜態變量堅持C返回到輸入堆棧。 getch使用getch和ungetch之間的共享數組,getop沒有意識到。
對不起,這樣一個簡單的例子中,較長的柱。
感謝您的幫助。我已經爲負值工作,但不能在沒有ungetch()的情況下進行減法運算。我想我理解了練習的大部分概念,所以我只是繼續前進。我在這上面花了太多時間。再次感謝! –