使用' *'时,C程序输出效果惊人。繁殖

时间:2014-10-09 22:02:46

标签: c

解决K& R中的练习5-10后

编写程序expr,它从命令行计算反向波兰表达式,其中每个运算符或操作数是一个单独的参数。例如,expr 2 3 4 + *评估2 *(3 + 4)。

在具有'*'字符的表达式中似乎存在问题,即使是基本的问题,例如:2 2 *。由于一些奇怪的原因,'*'没有放入运算符数组,而所有其他字符如'+',' - ','/'通常都是。我已经隔离了代码的一部分(while循环),这似乎是错误的。推送功能来自第4章,只需要编译代码。

#include <stdio.h>

void push(double f);

main(int argc, char *argv[])
{
    int a = 0;
    int b;
    char operator[10];

    while (--argc > 0) {
        if (isdigit(*argv[argc]))
            push(atof(argv[argc]));
        else if (*argv[argc]=='+' || *argv[argc]=='-' || *argv[argc]=='*' || *argv[argc]=='/')
            operator[a++] = *argv[argc];
    }
    for (b = 0; b < a; b++)
        printf("%c", operator[b]);
    printf("\n");

    return 0;
}

#define MAXVAL 100  /* maximum depth of val stack */

int sp = 0;     /* next free stack position */
double val[MAXVAL]; /* value stack */

/* push: push f onto value stack */
void push(double f)
{
    if (sp < MAXVAL) 
        val[sp++] = f;
    else
        printf("error: stack full, can't push %g\n", f);
}

输出

[user@machine Desktop]$ ./prog + +
++
[user@machine Desktop]$ ./prog *

[user@machine Desktop]$ ./prog * *

[user@machine Desktop]$ ./prog + / * -
-/+

1 个答案:

答案 0 :(得分:11)

你的shell正在解释*并扩展它。对于shell,&#39; *&#39;表示&#34;匹配所有文本&#34;,这就是像ls *.c这样的命令工作的原因。输入echo *,您就会明白我的意思。将您的参数放在单引号中以防止shell解释它们。

如,

./prog '*'
./prog 2 2 '*'
./prog '2' '2' '*'

请注意,如果您将所有参数放在引号内,那么整个内容将作为argv中的一个条目提供给您的程序,这可能不是您想要的。

例如,此命令会将argv[1]填入文字2 2 *,而不是将其分解为22* argv[1] 1}},argv[2]argv[3]

./prog '2 2 *'

您还可以使用反斜杠而不是引号来转义需要转义的单个字符。如果您告诉shell *,您的程序将获得文字\*

如,

./prog 2 2 \*

此模式匹配通常称为globbing