2016-11-18 23 views
1

我正在嘗試在C中使用使用使用struct實現的堆棧創建反轉 - 波蘭符號解釋器。它應取所有的一位數值(0-9)和運算符+,-,*/,並通過退出程序拒絕所有其他數值。將字符串的數字成員(類型char)轉換爲在C中鍵入int:RPN解釋器

我想捕獲整個表達式,因爲它是作爲字符串鍵入的,它具有char類型,但是當我使用isdigit()時,它總是返回一個非零函數(IE,它不是數字),甚至當它看起來是給用戶的時候。我相信這是爲了處理字符串是char類型的事實,但我不認爲我可以使用其他任何東西,否則在輸入運算符時會收到錯誤消息。

錯誤如下:假設我輸入"11+"進入函數。在調試中,我可以看到這出現在手錶中。推進該計劃,我看到isdigit()已返回1而不是0,因此if語句條件滿足,並退出程序退出(1); IDE沒有提供特定的錯誤消息。

是否有一種方法可以將字符串的「數字」轉換爲int類型,還是還需要做其他操作?

這是功能。雖然它仍然是原始和未完成的,這顯示了錯誤:

void parseRPN(TopStack *st) 
{ 
char Input[50]; 
int i; 
do{ 
    printf("please enter an expression in single-digit integers" 
     "using Reverse Polish notation:"); 
    scanf("%s",&Input); 
    if (sizeof(Input)/sizeof(int)>=50) 
     { 
      printf("that expression was too large for the RPN engine to handle!" 
       "please break it down into smaller sub-tasks.\n"); 
      fflush(stdin); 
      continue; 
     } 
    break; 
}while(true); 

for (i=0;i<50;i++) 
    { 
     int ErrorDetect=isdigit(Input[i]); 
     if (ErrorDetect==0 && (Input[i]) != '+' || '-' || '*' || '/') 
     { 
      printf("Error: Invalid operand to RPN\nExiting..."); 
      exit(1); 
     } 
     else printf("great success!"); 
    } 
} 
+0

請在您的文章添加 '錯誤',你得到的。 –

+1

建議:使用'strlen(Input)'而不是'sizeof(Input)/ sizeof(int)',然後使用'for(i = 0; i

+0

多數民衆贊成在一個不錯的主意,我正在使用,所以我會加入。雖然沒有解決問題,但... – Thefoilist

回答

2

當然無意使用||
@J. Piquard也評論到

// if (ErrorDetect==0 && (Input[i]) != '+' || '-' || '*' || '/') 
if (ErrorDetect==0 && Input[i] != '+' || Input[i] != '-' || 
    Input[i] != '*' || Input[i] != '/') 

或者東西這樣。建議添加()爲清晰..我想OP想要不同的邏輯。

if (ErrorDetect || (Input[i] != '+' && Input[i] != '-' && 
    Input[i] != '*' && Input[i] != '/')) 

其他編碼的問題可能存在,如:

char Input[50]; 
// scanf("%s",&Input); 
scanf("%49s",&Input); 
+0

謝謝!這修正了數字解釋,但它不修復操作符解釋,當我輸入11+時,它仍然退出程序,只是這次在「+」上。我嘗試在地方添加圓括號以便清楚,無濟於事:/新語句是if((ErrorDetect == 0)&&((Input [i]!='+')||(Input [i]!= '''')|| (Input [i]!='*')||(Input [i]!='/')))' – Thefoilist

+0

@jamesharris查看'for(i = 0; i <50; i ++)'爲什麼50,爲什麼不停在''\ 0''?您的代碼聲明瞭空字符錯誤。 – chux

+0

我已經改變了代碼爲'for(i = 0; i Thefoilist

相關問題