2015-01-11 31 views
0

我對C中後綴記法計算器的輸入有問題。 我的老師讓我使用scanf(「%s」,令牌)來獲取輸入。要停止讀取令牌,我檢查scanf返回的值是否爲EOF。如果我在測試時使用輸入重定向,它會起作用,但如果我在Windows cmd上編寫表達式,我會陷入無限循環。如何在不輸入字符串的情況下直接按Enter鍵來停止scanf? 下面的代碼:使用scanf爲後綴記法計算器讀取表達式

#include <stdio.h> 
#include <ctype.h> 
#include "stack.h" 

int main(){ 
    int a,b,t,stop; 
    char token[10],c; 
    do{ 
     stop = scanf("%s",token); 
     if (stop == EOF){ 
      break; 
     } 
     if (isdigit(token[0])){ 
      t = atoi(token); 
      push(t);  
     }else{ 
      a = top(); 
      pop();  
      b = top(); 
      pop(); 
      c = token[0]; 
      switch(c){ 
      case '+': t = a + b; 
         break; 
      case '-': t = a - b; 
         break; 
      case '*': t = a * b; 
         break; 
      case '/': t = a/b; 
         break; 
      } 
      push(t); 
     } 
    } while(1); 
    printf("Result: %d\n",top()); 
} 

的問題是在如果停止變量inizialisation後塊,我想。對不起,我是英國人,我是意大利學生,我儘量保持整潔。

+2

'CTRL + z'爲'EOF' – BLUEPIXY

+0

@BLUEPIXY或'CTRL + D' –

+0

@iharob他的系統是'視窗cmd'(他寫) – BLUEPIXY

回答

0

「如何在不輸入字符串的情況下直接按Enter鍵來停止scanf?」

使用scanf()閱讀'\n'輸入)具有挑戰性。 fgets()fgetc()是一個更好的方法。但下面顯示瞭如何近似使用scanf()

%sscanf("%s",token);首先消耗領先的空白,包括'\n'。在撥打scanf("%s",token);之前,代碼必須首先檢測到潛在的'\n'

char ws[2]; 

// Consume white-space, but not \n 
scanf("%*[ \f\r\t\v]"); // Depending on locale, this may not be a complete list 
if (1 == scanf("%1[\n]", ws) { 
    break; 
} 

stop = scanf("%s",token); 
if (stop == EOF){ 
    break; 
} 

一個更清潔的方式來做到這一點。

int ch; 
while (isspace(ch = fgetc(stdin)) && ch != '\n'); 
if (ch == '\n') { 
    break; 
} 
ungetc(ch, stdin); 

stop = scanf("%s",token); 
if (stop == EOF){ 
    break; 
} 
0

只有一個問題:停止程序,我不得不按Ctrl + Z 兩次。你能告訴我爲什麼嗎?

通常,線路緩衝文本模式下的C標準輸入是通過調用系統特定的函數來實現的,該函數讀取一行並返回其中的字符數(包括換行符);當數字0被返回時,這被認爲是EOF。現在,當您輸入「3 5 +(crtl + z)(ctrl + z)」時,第一個Ctrl-Z結束輸入行並使讀取函數返回5,但這並不表示標準輸入函數的EOF ;只有在沒有中間輸入的情況下按下第二個Ctrl-Z之後,返回0並將其識別爲EOF。