2012-05-03 111 views
2

所以我一直通過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沒有意識到。

對不起,這樣一個簡單的例子中,較長的柱。

回答

2

其基本思想是,您目前擁有ungetch()的任何位於getop的位置,您將您的靜態變量設置爲您未獲取的值。然後,在你撥打getch()的任何地方,你都會從靜態變量中獲得值,而不是有效的(你可能需要第二個靜態變量來說明它是否有效,當你讀取它時清除它,並設置你何時取消進去)。

+0

感謝您的幫助。我已經爲負值工作,但不能在沒有ungetch()的情況下進行減法運算。我想我理解了練習的大部分概念,所以我只是繼續前進。我在這上面花了太多時間。再次感謝! –