2014-09-27 55 views
0

我試圖做一個RPN,其中我不是常量argv矢量通過用操作結果替換運算符來存儲和檢索計算結果: 的argv [0] = 「2」;的argv [1] = 「3」; argv [2] =「+」==> argv [0] =「2」; argv [1] =「3」; argv [2] = 5 我的代碼適用於簡單的RPN輸入 - 一個操作;它在嵌套操作失敗,因爲當它讀取argv [n]時,它找不到任何內容,因此它將其視爲零。 你們能幫忙嗎?下面的代碼:C:使用argv作爲存儲和檢索結果的方式

/* 
    * Ahmed AlJehairan 
    * Github: aj326 
    * Description: Reverse Polish Calc. Usage ./expr n1 n2 op 
    */ 
    #include <stdio.h> 
    #include <stdlib.h> 
    #define DEBUG 1 
    //Will implement error checking later: 
    /* 
    Errors to check for: 
     arg starts with letter 
     first arg not a number 
     check at least two arg for binary ops 
    */ 

    int main(int argc, char *argv[]) 
    { 
     char **s = argv; 
     int len = argc; 
     if (argc < 3) 
     { 
      printf("At least 2 arguments\n"); 
      return 1; 
     } 
    if (--argc) argv++; 

    int val; 
    while (argc--) 
    { 
     switch (**argv) 
     { 

     case '+': ; val = atoi(*(argv - 2)) + atoi(*(argv - 1)); snprintf (*argv, sizeof(int), "%d", val); if (DEBUG) printf("after arith *argv %s \n", *argv); break; 
     case '=': ; val = atoi(*(argv - 2)) == atoi(*(argv - 1)); snprintf (*argv, sizeof(int), "%d", val); if (DEBUG) printf("after arith *argv %s \n", *argv); break; 
     case '-': ; val = atoi(*(argv - 2)) - atoi(*(argv - 1)); snprintf (*argv, sizeof(int), "%d", val); if (DEBUG) printf("after arith *argv %s \n", *argv); break; 
     case '*': ; val = atoi(*(argv - 2)) * atoi(*(argv - 1)); snprintf (*argv, sizeof(int), "%d", val); if (DEBUG) printf("after arith *argv %s \n", *argv); break; 
     case '/': ; val = atoi(*(argv - 2))/atoi(*(argv - 1)); snprintf (*argv, sizeof(int), "%d", val); if (DEBUG) printf("after arith *argv %s \n", *argv); break; 
     case '%': ; val = atoi(*(argv - 2)) % atoi(*(argv - 1)); snprintf (*argv, sizeof(int), "%d", val); if (DEBUG) printf("after arith *argv %s \n", *argv); break; 
     } 
     if (DEBUG) 
     { 
      int i; 
      for (i = 0; i < len; ++i) 
      { 
       printf("%s\t", s[i]); 
      } 
      printf("\n"); 
     } 
     argv++; 
    } 
    printf("%s\n", *--argv); 
    return 0; 
} 
+0

準備一個結果的另一個轉換數組。 – BLUEPIXY 2014-09-27 01:00:45

+1

我會簡單地注意到編寫一個程序的可怕的可怕性,該程序調用未定義的行爲*通過設計給定無效輸入。即'+ 0 1'。更糟糕的是,假設輸入是「有效」的,儘管該標準允許您在0..argc中的任何'n'的'argv [n]'處存儲* alternate *地址。它不會聲稱在* exiting *地址處的內存是可寫的。總之,這是一個可怕的想法。使用適當大小的本地'int'堆棧。 – WhozCraig 2014-09-27 01:37:58

+0

@WhozCraig有關「標準允許您在argv [n]存儲備用地址」請參閱http://stackoverflow.com/questions/25737434/is-argvn-writable/25747537此外,該規範明確指出argv [] []是可寫的儘管它在這個範圍內很安靜。 – chux 2014-09-27 03:00:02

回答

1

snprintf (*argv, sizeof(int),...不一定有效。

可用的尺寸當然不是由sizeof(int)定義的,不應該假定爲比原來的strlen(argv[])+1更多。

尺寸char需要打印任意intvaries。建議

#define MAXPRINTSIZE (CHAR_BIT*sizeof(int)*10/33 + 3) 
char bufer[MAXPRINTSIZE]; 
snprintf (buffer, sizeof buffer, "%d", val); 

你將不得不重新考慮你的緩衝區管理。

+0

+1(彷彿你沒有看到那樣)。 – WhozCraig 2014-09-27 03:06:37