我試圖做一個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;
}
準備一個結果的另一個轉換數組。 – BLUEPIXY 2014-09-27 01:00:45
我會簡單地注意到編寫一個程序的可怕的可怕性,該程序調用未定義的行爲*通過設計給定無效輸入。即'+ 0 1'。更糟糕的是,假設輸入是「有效」的,儘管該標準允許您在0..argc中的任何'n'的'argv [n]'處存儲* alternate *地址。它不會聲稱在* exiting *地址處的內存是可寫的。總之,這是一個可怕的想法。使用適當大小的本地'int'堆棧。 – WhozCraig 2014-09-27 01:37:58
@WhozCraig有關「標準允許您在argv [n]存儲備用地址」請參閱http://stackoverflow.com/questions/25737434/is-argvn-writable/25747537此外,該規範明確指出argv [] []是可寫的儘管它在這個範圍內很安靜。 – chux 2014-09-27 03:00:02