关于命令行参数为“*”时,argc比实际多增加2个值,argv所指的该字符串并不是*的问题。
是C程序设计语言的习题5-10,要求编写程序expr,以计算从命令行输入的逆波兰表达式的值,其中每个运算符或操作符用一个单独的参数表示,例如命令 expr 2 3 4 + *,将计算表达式 2*(3+4)
程序写完了,在windows和linux下都可以运行。有一个问题,就是当输入乘号'*'的时候,argc的值会比实际的多增加2个,然后*argv所指参数字符串应该是乘号*的组,变成了某一目录名字,而不是*了。同时运算出错,我想知道这两个原因,一个是argc为什么会比实际数值多2,argv参数为*,到底发生了什么事,要怎样修改才能正确运行。除此之外,+-/的运算符都正常运行。
我知道可以用其它特殊符号来代替乘法符号*,就可正常运行,但是想知道为什么输入*发生这么多事。我猜想可能是和指针*的符号有关吧。
望达人解答下小弟的疑惑,感谢~
- C/C++ code
double op, op2; printf("*argc is %d\n\n", argc); /*查看argc的值*/ while (--argc > 0) { c = 0; *++argv; printf("argv[0] is %s\n", argv[0]); /*查看argv[0]的值*/ while (isdigit((*argv)[c])) /*查看检查*argv指针所指字符串中的各个元素,防止格式输入错误的值*/ ++c; if (c > 0 && !isdigit((*argv)[c]) && (*argv)[c] != 0) /*防止符号和数字在一起还执行的格式错误*/ { printf ("zifu shuru geshi cuowu\n"); c = 0; return 0; } if (c > 0 && isdigit((*argv)[0])) /*确定此avgr[c]的字符串是数字,入栈处理,把所有数字组入栈*/ { op = atof(argv[0]); printf("op is %.8g\n", op); push(op); } else { fh = *argv[0]; /*遇到符号组后,从栈中取2个数,执行运算*/ switch (*argv[0]) { case '+' : push(pop() + pop()); break; case '-' : op2 = pop(); push(pop() - op2); break; case '*' : push(pop() * pop()); break; case '/' : op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf ("error: zero divisor\n"); break; default : break; } } } printf (" Number is %.8g\n", pop()); return 0;}int sp = 0;double val[MAXLINE];void push(double f){ if (sp < MAXLINE) val[sp++] = f; else printf ("error: stack full,can't push %g\n", f);}double pop(void){ if (sp > 0) return val[--sp]; else{ printf ("error: stack empty\n"); return 0.0; }}[解决办法]
*是shell的通配符,会在传入到程序之前解析为当前目录下的所有文件。
用''扩起来即可。
[解决办法]
也可以用\*这样的转义符来阻止Shell解释*。