打印堆栈时出错

时间:2015-01-26 14:57:56

标签: c

我正在尝试使用stack实现一个程序。但是堆栈没有显示

#include<stdio.h>
int size=0,count=1,test=0;

struct Car
{
    int registrationNo;
    char *name;
};

struct ParkingLot
{
    struct Car C[10];    
};


struct stack
{
    struct ParkingLot P;
    int top;
} st;

int stfull()
{
    if(st.top >= size-1)
        return 1;
    else
        return 0;
}


void push(struct Car item) {
    st.top++;
    st.P.C[st.top] = item;
}



int stempty() {
    if (st.top == -1)
        return 1;
    else
        return 0;
}

void display() {
    int i;
    if (stempty())
        printf("\nStack Is Empty!");
    else {
    //printf("%d\n",st.top);
        for (i = 0; i<=st.top; i++)
            printf("\n%s", st.P.C[i].name);
    }
}



void Enter_ParkingLot()
{
    struct Car CC;
    int checkFull=stfull();
    if(checkFull==1)
        printf("Parking Lot is FUll\n");
    else
    {
        CC.registrationNo=count;count++;
        char ch[100];
        printf("Enter name of owner\n");
        scanf("%s",ch);

        CC.name=ch;

        push(CC);
    }
}



int main()
{
    printf("Enter size of Parking Lot\n");
    st.top=-1;

    scanf("%d",&size);
    Enter_ParkingLot();
    Enter_ParkingLot();
    display();
    return 0;
}

这是我在终端上的输入 -

Enter size of Parking Lot
2
Enter name of owner
ABCD
Enter name of owner
EFGH

这是我的输出 -

`@
`@

输出中第一个@之前有一个空行。

2 个答案:

答案 0 :(得分:1)

问题:

  1. 将汽车名称存储到堆栈中分配的数组中。
  2. 然后将指向该数组的指针复制到您的汽车对象。
  3. 然后原始数组超出范围。
  4. 然后尝试通过指针打印不再存在的数组。
  5. 发生未定义的行为。
  6. 解决方案:

    您需要使用malloc()为汽车名称分配内存,并使用strcpy()将其复制到汽车对象。

答案 1 :(得分:1)

如果您将struct Car中的指针字段分配给本地变量,它将无效,您需要重新声明struct Car这样的

struct Car
{
    int registrationNo;
    char name[100];
};

然后代替

CC.name=ch;

这样做

strcpy(CC.name, ch);

另外,编写

更好
scanf("%99s",ch);

以防止溢出ch,在您的情况下,执行

会更好
scanf("%99s", CC.name);

我修复了你的代码

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

struct Car
{
    int registrationNo;
    char name[100];
};

struct ParkingLot
{
    struct Car C[10];
};

struct stack
{
    struct ParkingLot P;
    int top;
} st;

int stfull(int size)
{
    if(st.top >= size - 1)
        return 1;
    return 0;
}

void push(struct Car item)
{
    st.P.C[++(st.top)] = item;
}

int stempty()
{
    if (st.top == -1)
        return 1;
    return 0;
}

void display()
{
    int i;
    if (stempty() != 0)
        printf("\nStack Is Empty!");
    else {
        for (i = 0 ; i <= st.top ; i++)
            printf("\n%s", st.P.C[i].name);
    }
}

int Enter_ParkingLot(int count, int size)
{
    struct Car CC;

    if (stfull(size) == 1)
        printf("Parking Lot is FUll\n");
    else
    {
        CC.registrationNo = count;

        printf("Enter name of owner\n");
        scanf("%99s", CC.name);

        push(CC);
    }

    return count + 1;
}

int main()
{
    int size = 0, count = 1;

    printf("Enter size of Parking Lot\n");

    st.top = -1;

    scanf("%d", &size);

    count = Enter_ParkingLot(count, size);
    count = Enter_ParkingLot(count, size);

    display();
    return 0;
}
  1. 我删除了全局变量,不需要它们。
  2. 我修复了一些没有意义的if / else
  3. 我还应用了我之前建议的与原始问题相关的修补程序。