【问题标题】:Stack and pop help for postfix notation. Printing wrong values, C prog [duplicate]后缀表示法的堆栈和弹出帮助。打印错误的值,C prog [重复]
【发布时间】:2019-04-01 23:38:30
【问题描述】:

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

命令行参数:“12+”应该等于等式“1+2”

int pop(stack *p);

int main(int argc, char **argv)
{

    stack ph;
    int i, a, b;
    int val = 0;

    if (argc!=2)
    {
            printf("Usage: %s argument\n", argv[0]);
            exit(1);
    }
    else{
            int i;
            int length = strlen(argv[1]);
            int count;
            initializedStack(&ph);

            for(i=0;i<length;i++)
            {
                    if (argv[1][i] == '+'){
                            a = pop(&ph);
                            printf("%d\n", a);
                            b = pop(&ph);
                            printf("%d\n", b);
                            val = a+b;
                            push(&ph,val);
                    }
                    else{
                            push(&ph, argv[1][i]);
                    }
            }
            printf("%d\n", pop(&ph));
    }

    return 0;
}

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;
}

我目前处于程序的测试阶段,它只包括加法操作。为了测试这个程序,我为 if 语句的加法部分打印了语句,并在最后弹出。运行它会给我以下输出:

50
49
99

什么时候输出应该是:

1
2
3

加法操作好像有效,但不知道50和49是从哪里来的?编写代码以提供准确输出的正确方法是什么?谢谢!

【问题讨论】:

    标签: c stack printf command-line-arguments


    【解决方案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;
    }
    

    【讨论】:

    • 也许说“数值”而不是二进制,可能更清楚?
    • @SamiKuhmonen 我改写了更清晰的措辞。而且,我添加了一个示例,该示例将参数标记为允许多位数字
    猜你喜欢
    • 2014-08-21
    • 2017-08-15
    • 1970-01-01
    • 2021-02-06
    • 2016-07-08
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多