【发布时间】: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