堆栈和弹出帮助的后缀符号。打印错误的值,C编

时间:2018-10-29 04:24:14

标签: c stack printf command-line-arguments

我的代码接受1个命令行参数,该参数逐个字符地读取命令行并相应地放置堆栈。

“ 12+”的命令行参数应等于“ 1 + 2”的方程式

    var foo = document.getElementById('foo');

document.getElementById('hide-button').onclick = function () {
    foo.className = 'hidden';
};

document.getElementById('show-button').onclick = function () {
    foo.className = '';
};

我目前正在程序的测试阶段,它仅包含加法运算。为了测试该程序,我为if语句的附加部分提供了打印语句,并在最后弹出。运行此命令可以得到以下输出:

       #foo {
    transition-property: visibility, opacity;
    transition-duration: 0s, 1s;
}

#foo.hidden {
    opacity: 0;
    visibility: hidden;
    transition-property: opacity, visibility;
    transition-duration: 1s, 0s;
    transition-delay: 0s, 1s;
}

输出应为:

<a href="#" id="foo">Text</a>
<button id="hide-button">Hide</button>
<button id="show-button">Show</button>

加法运算似乎有效,但我不知道50和49来自何处?什么是编写代码以提供准确输出的正确方法?谢谢!

1 个答案:

答案 0 :(得分:1)

当您这样做:

push(&ph, argv[1][i]);

您要为给定的数字推送 ASCII 值,而不是为其解码的数值[后者等于atoi将返回的值可以对单个字符进行操作]。

这可能不是您想要的,因为稍后您按a + b,它们是数字/二进制值。

尽管这仅适用于单个数字,但快速解决方案是:

push(&ph, argv[1][i] - '0');

否则,通常,您需要汇编整个 个数字字符串,并用atoi对其进行解码。

在这种情况下,您需要为12 23 +

处理一些空格。

这是一个清理后的版本,它使用strtokatoi允许使用更通用的数字。 [请原谅免费的样式清理]:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int top;
    int items[100];
} stack;

void
initializedStack(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;
}

int
main(int argc, char **argv)
{
    stack ph;
    int i,
     a,
     b;
    int val = 0;
    char *buf;
    char *token;
    int chr;

    if (argc != 2) {
        printf("Usage: %s argument\n", argv[0]);
        exit(1);
    }

    buf = argv[1];

    initializedStack(&ph);

    while (1) {
        token = strtok(buf," ");
        if (token == NULL)
            break;
        buf = NULL;

        chr = token[0];

        if (strcmp(token,"+") == 0) {
            a = pop(&ph);
            printf("%d\n", a);

            b = pop(&ph);
            printf("%d\n", b);

            val = a + b;
            push(&ph, val);
            continue;
        }

        if ((chr >= '0') && (chr <= '9')) {
            val = atoi(token);
            push(&ph, val);
            continue;
        }
    }

    printf("%d\n", pop(&ph));

    return 0;
}