2012-05-03 3 views
2

지난 몇 주 간 K & R 서적을 살펴 보았습니다. 나는 모든 것을 순조롭게 끝내었고, 많이 건너 뛰지 않았다. 나가 무언가에 붙어 얻는 경우에 나는 보통 예를 google 수 있고 응답을 찾아 낼 수있다, 그러나 이번에, 나는 비틀었다.K & R C 연습 문제 4-11, 정적 변수

4.6 절에서는 외부와 내부 모두에서 정적 변수를 선언합니다. 운동은 다음과 같이 말합니다 :

연습 4-11. ungetch를 사용할 필요가 없도록 getop을 수정하십시오. 힌트 : 내부 정적 변수를 사용하십시오.

폴란드어 계산기와 관련이 있습니다. 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; 

내 문제는 그 계정에 우리가 있었던 수정을하지 않는 것입니다

원래의 기능은 다음과 같습니다 음수를 처리하는 것이 었습니다. 내가 찾은 예제 중 아무 것도 변수가 정적이라는 사실을 전혀 사용하지 않는 것으로 보이므로 함수가 호출 된 후에도 그대로 남아 있습니다. 결국 EOF로 설정했습니다. 함수 호출간에 변수가 무엇인지 상관 없으면 정적 변수를 사용해야하는 이유는 무엇입니까?

마지막으로 정적 변수를 사용하여 입력 스택에 다시 고정하는 방법을 모르겠습니다. getch는 getch와 ungetch 사이에 공유 배열을 사용합니다. getop은 인식하지 않습니다.

죄송합니다.

답변

2

기본 아이디어는 현재 ungetch()이있는 getop에있는 모든 곳에서 정적 변수를 가져 오지 않을 값으로 설정한다는 것입니다. 그런 다음 getch()을 호출하는 모든 곳에서 정적 변수의 값을 얻습니다 (유효한지 여부를 말할 때 두 번째 정적 변수가 필요하고 읽을 때 지우고 설정하지 않은 경우 설정해야합니다). 그것으로).

+0

도움 주셔서 감사합니다. 음수 값에 대해서는 작동하지만, ungetch()가 없으면 뺄셈을 사용할 수 없습니다. 나는 운동의 대부분의 개념을 이해한다고 생각합니다. 그래서 나는 계속 전진 할 것입니다. 나는 이것에 너무 많은 시간을 보냈습니다. 다시 한 번 감사드립니다! –