2012-05-20 28 views
-2

好的。讓我重新開始。我正在嘗試編寫一個程序來評估逆波蘭表示法的參數。 (即/程序2 4 +,其評估爲6)。ctype.h isdigit不能在argv

int main(int argc, char *argv[]) 
{ 
    char oper[MAXOP]; 
    char *ptr; 
    unsigned char c; 
    double op2; 
    while (--argc > 0 && ++argv != NULL) { 
    ptr = oper; 
    if (isdigit(c = **argv)) 
    { 
     while (isdigit(c = **argv++)) 
     { 
      *ptr++ = c; 
     } 
     *ptr = '\0'; 
     push(atof(oper)); 
    } 
    else if (isalpha(c)) 
    { 
     while (isalpha(c = **argv++)) 
     { 
      *ptr++ = c; 
     } 
        ... 
     ... 
    } 
} 

程序應該檢查的每個參數的第一個字符,如果它是α或數字或操作,但它總是被證明是一個alpha。

+++++++++ UPDATE +++++++++++++

嗯,這很奇怪。它現在正在工作。在條件之前, isdigit(c = **argv)對於數字參數的計算結果不爲真(如果其餘代碼錯誤,則無關緊要)。現在確實如此,但條件isdigit(c = **argv++)是錯誤的。

應該isdigit(c = *argv[0]++)

我有兩個同名的文件。他們在不同的目錄中,但包含相同的代碼。在使用這個函數時,我必須在另一個目錄中編譯另一個文件,並且因此得到相同的輸出,儘管編輯了這個文件。我的錯。

+2

此代碼只是傷害了我的眼睛。將所有殘留的副作用移出條件並再次詢問。但是你的問題是什麼? –

+1

真的,沒有人應該寫這樣的代碼。 – zmbq

+1

我不認爲'** argv ++'會做你認爲它的作用(這也是你應該使用更簡單的操作的原因之一)。 –

回答

3

您是否嘗試過使用調試器,並搞清楚發生了什麼?

我的第一個猜測是**argv++是錯的(你是不是增加了argv?* argv?** argv?即使它沒有錯,它只是混淆了代碼)。切換到:

char *cur_arg = *argv; 

,再三cur_arg(使用cur_arg ++才能到下一個字符,而不是C = * cur_arg ++ - 再次,混淆代碼)。

0
#include <stdio.h> 
#include <ctype.h> 

#define MAXOP 16 

int main(int argc, char *argv[]) { 
    char oper[MAXOP]; 
    char *ptr; 
    unsigned char c; 
    double op2; 

    while(--argc > 0 && ++argv != NULL) { 
     ptr = oper; 
     if(isdigit(c = **argv)){ 
      while(isdigit(c = *(*argv)++)){ 
       *ptr++ = c; 
      } 
      *ptr = '\0'; 
      printf("DEBUG:%s\n", oper); 
     } else if(ispunct(c)){//isalpha is alphabet check , '+' does not fit. 
      while(ispunct(c = *(*argv)++)){ 
       *ptr++ = c; 
      } 
      *ptr = '\0'; 
      printf("DEBUG:%s\n", oper); 
     } 
    } 
    return 0; 
}