c - C 中的逆波兰计算器 : using argv as a way to store and retrieve results

标签 c argv

我正在尝试做一个 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/

相关文章:

c - C 中任意内存的类型

Python 的 argv 和 bash?

c - 在 C 中的凯撒密码中使用 argc 和 argv

C Argv 检查哪个 argv 路径来自哪个输入

python - 名称错误 : name 'argv' is not defined

c - 以下哪项是下面给出的程序的正确输出?

c - undefined reference 错误但符号存在于库中

c - 嵌套范围如何影响堆栈深度?

c - 除非使用printf,否则多线程测试C应用程序将挂起

c++ - argv 的段错误