首页 > 解决方案 > 后缀符号的堆栈和弹出帮助。打印错误的值,C prog

问题描述

我的代码接受 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 来自哪里?编写代码以提供准确输出的正确方法是什么?谢谢!

标签: cstackprintfcommand-line-arguments

解决方案


当你这样做时:

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

您正在推送给定数字的ASCII值,而不是其解码后的数值 [atoi如果它可以对单个字符进行操作,后者相当于返回的值]。

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

虽然这仅适用于单个数字,但快速解决方法是:

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

否则,通常,您需要组装整个数字字符串并使用 (eg) 对其进行解码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;
}

推荐阅读