1

我正在尝试制作一台可以执行以下操作的反向波兰打印机-

输入:

  1. (a+(b*c))
  2. ((a+b)*(z+x))
  3. ((a+t)*((b+(a+c))^(c+d)))

输出:

  1. abc*+
  2. ab+zx+*
  3. at+bac++cd+^*

这是我的代码:

#include <stdio.h>
#include <string.h>
char pop(int t);
void push(int c, int t);
int main()
{
    int z;
    scanf("%d", &z);
    char *a[100];
    int i = 0;
    int q = z;
    while (q-- > 0)
    {
        char v[400];
        scanf("%s", &v);
        int t;
        for (t = 0; t < strlen(v); t++)    //loop to put the values and signs in the 2 stacks
        {
            if ((v[t] == '*') || (v[t] == '+') || (v[t] == '-') || (v[t] == '^'))
            {
                push(v[t], 2);


            }

            else if (v[t] == ')')
            {
                int y = pop(2);
                push(y, 1);

            }

            else
            {
                push(v[t], 1);

            }
        }
        int k = 0;
        char c;
        while ((c = pop(1)) !='\0')    //loop to put elements in the array v
        {

            if (c != '(')
            {

                v[k++] = c;

            }
        }
        v[k--] = '\0';
        int m;
        for (m=0; m != k; m++, k--)     //for reversing the string
        {
            char t = v[m];
            v[m] = v[k];
            v[k] = t;
        }

        a[i++] =v;
        printf("%s",a[i - 1]);
    }
    int p;
    for (p = 0; p <z ; p++)   //printing the elements
        printf("%s\n",*a[p]);
    return 0;
}
char ac[400];
char as[400];
int ic = 0;
int is = 0;
void push(int c,int t)
{
    if (t == 1 && ic != 400)
        ac[ic++] = c;
    else if (t == 2 && is != 400)
        as[is++] = c;
}
char pop(int t)
{
    if (t == 1 && ic != 0)
        return ac[--ic];
    if (t == 2 && is != 0)
        return as[--is];
    return '\0';
}

但它甚至没有正确输入,我无法弄清楚这段代码中有什么错误。请帮助找出问题所在。

4

1 回答 1

0

输入测试用例的数量 ieint z 和第一行如果输入它崩溃

这是由于

        printf("%s\n",*a[p]);

正如 BLUEPIXY 所注意到的,*a[p]是一个char; 但%s期望 a char *,因此您需要

        printf("%s\n", a[p]);

并且关于v超出范围,关键因素不是范围(可见性),而是存储持续时间(生命周期)v- 它的生命周期在与其关联的块的执行结束时结束,以及指向a[i]它的指针的值变得不确定;通过改变

        a[i++] =v;

        a[i++] = strdup(v);

你可以补救。

于 2015-08-14T09:20:56.227 回答