命令行 "*"操作数在后缀表示法 c 程序中不起作用

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

我有一个 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;
}

最佳答案

试试这个:\*.与 C 语言非常相似,您需要为命令行可识别的参数提供转义字符。 (其中“\”是转义符)。

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

关于命令行 "*"操作数在后缀表示法 c 程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24517124/

相关文章:

C - 将可变数量的命令行参数传递给具有可变数量参数的方法

PHP 多个搜索下拉菜单

Java:绘制乘法表的起始循环增量

bash - 如何在 Bash getopts 内置函数中使用长选项?

java - 通过java程序在命令提示符下读写多个命令

C - 使用出队进行回绕时队列的段错误

c - 如何查找系统上是否安装了less?

JavaScript 乘以 100 得到奇怪的结果

C 用 T 和 H 填充棋盘,不知何故有间隙,只有 7 行而不是 8 行

c - 读取 int 类型时如何不读取 scanf 中的 float 类型