C-字符推送和弹出操作

时间:2018-01-03 01:10:49

标签: c arrays stack pop strcat

Stack create(int c)
{
    Stack S=(Stack)malloc(sizeof(struct stack));

    S->size=c;
    S->top=-1;
    S->array=(char *)malloc(sizeof(char)*c);

    return S;
}

Stack makeEmpty(void)
{
    Stack *S1=create(100);
    S1[0]->top=-1;
    return S1;
}

char pop(Stack S)
{
    return S->array[S->top--];
};

int main(void)
{
    Stack *S1;
    S1=makeEmpty();
    int j;
    int k=0;
    char result[30];
    for(j=0; j<2; j++)
    {
        char result1=pop(S1);
        strcat(result, result1);
        k++;
    }
}

我跳过了一些部分,例如typedef struct stack Stack; 我想要做的是在for循环工作时从堆栈中弹出元素。然后,将这些元素存储在result的新数组中。为了检查它是否有效,我打印出来但是我遇到了运行时错误。如何存储元素以及如何将其打印出来?

1 个答案:

答案 0 :(得分:0)

我已经复制并粘贴了您的代码,但它并没有被编译。我觉得 你要么不发布你的实际代码,也不要编写和阅读编译器警告。很难帮助你。这里有一些我注意到的事情:

1。 create必须返回指向Stack的指针,而不是对象。

Stack *create(int c)
{
    Stack *S = malloc(sizeof *S);

    S->size=c;
    S->top=-1;
    S->array = malloc(c);

    return S;
}

2。 makeEmpty

也是如此
Stack *makeEmpty(void)
{
    Stack *S1=create(100);
    S1->top=-1;
    return S1;
}

3。 pop应该指向Stack,而不是对象

char pop(Stack *S)
{
    return S->array[S->top--];
};

在这里你应该检查你的堆栈上是否有元素。 int pop(Stack *S, char *val),它返回1并在*val上写入 成功,并返回0否则会更好。

4。 从您的pop来看,您只推动char。我不明白你的意思 正在尝试strcat。无论哪种方式,你都在做strcat错误。您 声明一个包含100个空格的堆栈,但您只声明了30个空格 为result。如果你的堆栈中有超过31个元素怎么办?我知道 你只是在检查2个元素,但它很容易被忽视 扩展它以遍历所有堆栈而不改变内存要求 result

同样strcat是一个与C-Strings一起使用的函数,这意味着它需要 C-字符串。 C-String 必须\0终止,你的不是。你有 看起来像C字符串的东西,但它不是。如果你坚持使用 strcat,你应该这样做:

for(j=0; j<2; j++)
{
    char result1[] = { pop(S1), 0 };
    strcat(result, result1);
}