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