2014-10-09 97 views
3

解決鍛鍊5-10在K&R後:C程序的令人驚訝的輸出當使用「*」乘以

編寫程序EXPR,其在命令行,其中每個計算一個逆波蘭表達運算符或操作數是一個單獨的參數。例如,expr 2 3 4 + *評估2 *(3 + 4)。

在'*'字符的表達式中似乎存在問題,即使是基本類似:2 2 *。出於某種奇怪的原因,'*'不會放入運算符數組中,而其他所有字符(如'+',' - ','/')通常都是。我已經隔離了代碼的一部分(while循環),這看起來是錯誤的。推送功能來自第4章,只需要編譯代碼。

#include <stdio.h> 

void push(double f); 

main(int argc, char *argv[]) 
{ 
    int a = 0; 
    int b; 
    char operator[10]; 

    while (--argc > 0) { 
     if (isdigit(*argv[argc])) 
      push(atof(argv[argc])); 
     else if (*argv[argc]=='+' || *argv[argc]=='-' || *argv[argc]=='*' || *argv[argc]=='/') 
      operator[a++] = *argv[argc]; 
    } 
    for (b = 0; b < a; b++) 
     printf("%c", operator[b]); 
    printf("\n"); 

    return 0; 
} 

#define MAXVAL 100 /* maximum depth of val stack */ 

int sp = 0;  /* next free stack position */ 
double val[MAXVAL]; /* value stack */ 

/* push: push f onto value stack */ 
void push(double f) 
{ 
    if (sp < MAXVAL) 
     val[sp++] = f; 
    else 
     printf("error: stack full, can't push %g\n", f); 
} 

輸出

[[email protected] Desktop]$ ./prog + + 
++ 
[[email protected] Desktop]$ ./prog * 

[[email protected] Desktop]$ ./prog * * 

[[email protected] Desktop]$ ./prog +/* - 
-/+ 

回答

11

你的外殼解釋*和擴大它。在shell中,'*'的意思是「匹配所有文本」,這就是爲什麼像ls *.c這樣的命令可以工作的原因。輸入echo *,你會明白我的意思。將您的參數放在單引號中以防止shell解釋它們。

例如,

./prog '*' 
./prog 2 2 '*' 
./prog '2' '2' '*' 

請注意,如果你把引號內的所有論據,那整個事情將給予你的程序作爲一個條目argv,這可能不是你想要的。

例如,該命令將填補argv[1]與文本2 2 *,而不是將其分成22*argv[1]argv[2]argv[3]

./prog '2 2 *' 

你也可以逃脫需要反斜槓,而不是逃避報價單個字符。如果您告訴shell \*,您的程序將得到一個字面值*

例如,

./prog 2 2 \* 

該圖案匹配通常被稱爲globbing

+0

哇,那很快!謝謝! – 2014-10-09 22:17:39

+0

感謝您花時間回答這個問題。你救了我一大堆的驚愕。 – ptdecker 2016-06-07 12:43:50

相關問題