【问题标题】:command line "*" operand not working in postfix notation c program命令行“*”操作数在后缀符号 c 程序中不起作用
【发布时间】:2014-07-02 02:49:42
【问题描述】:

我有一个将后缀符号转换为答案的 C 程序,因此对于“2 2 +”它会打印 4,对于“2 4 + 3 / 6 +”它会打印 8。但是,当我执行“2 4 ^ 2 * 5 % 2",它与“”有问题,因为它考虑了我所在的 bin 并将文件名添加到命令行参数中。我将附上我的代码,但我的问题是,无论如何要避免命令行中的“”与参数测试混淆。

PS,有人告诉我,通过在命令行中将 * 放在引号中,如下所示:

./a.out 2 4 ^ 2 "*" 5 % 2 -

会起作用,但它没有。那么有什么想法吗?

我的代码:

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct stack {

    int top;
    int items[100];

} stack;

void initializeStack(stack* p);
void push(stack* p, int val);
int pop(stack* p);

int main(int argc, char** argv) {

    int i, a, b;
    int val = 0;
    stack ph;
    initializeStack(&ph);

    //for(i=1; i<argc; i++)
        //printf("%s\n", argv[i]);

    for(i=1; i<argc; i++) {
        if(strcmp(argv[i], "*") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = a*b;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "/") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = b/a;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "+") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = a+b;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "-") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = b-a;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "^") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = (int)pow(a,b);
            push(&ph, val);
        }

        else if(strcmp(argv[i], "%") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = b%a;
            push(&ph, val);
        }

        else {
            push(&ph, atoi(argv[i]));
        }
    }

    printf("%d\n", pop(&ph));

    return 0;
}

void initializeStack(stack* p) {
    p->top = 0;
}

void push(stack* p, int val) {
    p->top++;
    p->items[p->top] = val;
}

int pop(stack* p) {
    int y;
    y = p->items[p->top];
    p->items[p->top] = 0;
    (p->top)--;
    return y;
}

【问题讨论】:

  • 您的程序看起来不错,并且在我刚刚在这里进行的测试中似乎可以正常工作。
  • 双引号可能仍会在某些 shell 中扩展通配符,请尝试单引号。
  • '*'if(strcmp(argv[i], "'*'") == 0) {

标签: c command-line-arguments multiplication postfix-notation


【解决方案1】:

试试这个:\*.就像在 C 中一样,您需要为命令行识别的参数提供转义字符。 (其中“\”是转义)。

免责声明:\ 无论如何都适用于 GNU/Linux(作为旁注,也适用于 Stack 答案...您需要两个 \ 才能打印一个 \)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2020-08-04
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多