首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于命令行参数为“*”时,argc比实际多增加2个值,argv所指的该字符串并不是*的有关问题

2012-09-22 
关于命令行参数为“*”时,argc比实际多增加2个值,argv所指的该字符串并不是*的问题。是C程序设计语言的习题5-

关于命令行参数为“*”时,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解释*。

热点排行