我正在尝试做一个 RPN,其中我的非恒定 argv vector 通过用运算结果替换运算符来存储和检索计算结果: argv[0]=“2”; argv[1]=“3”; argv[2]="+"==> argv[0]="2";argv[1]="3";argv[2]=5 我的代码适用于简单的 RPN 输入——最多一次操作的输入;它在嵌套操作中失败,因为当它读取 argv[n] 时,它在其中找不到任何内容,因此它将其视为零。 你们能帮忙吗?代码如下:
/*
* 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;
}
最佳答案
snprintf (*argv, sizeof(int),...
不一定有效。
可用的大小肯定不是由 sizeof(int)
定义的,并且不应假定为大于原始 strlen(argv[])+1
。
打印任意 int
所需的 char
大小 varies 。建议
#define MAXPRINTSIZE (CHAR_BIT*sizeof(int)*10/33 + 3)
char bufer[MAXPRINTSIZE];
snprintf (buffer, sizeof buffer, "%d", val);
您将不得不重新考虑缓冲区管理。
关于c - C 中的逆波兰计算器 : using argv as a way to store and retrieve results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070114/