使用堆栈反转字符串

时间:2017-01-10 08:59:51

标签: c

我在使用堆栈结构反转字符串时遇到问题。

我制作了一些代码来反转苹果'到了'elppa'并且看起来效果很好......

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

#define MAX_STACK_SIZE 5

typedef int element;

element stack[MAX_STACK_SIZE];

int top = -1;

void initialize() {
    top = -1;
}

int isEmpty() {
    return (top == -1);
}

int isFull() {
    return (top == (MAX_STACK_SIZE - 1));
}

void push(element item) {
    if (isFull()) {
        printf("stack is full, cannot add element.\n");
    }
    else{
        stack[++top] = item;
    }
}

element pop() {
    if (isEmpty()) {
        printf("stack is empty\n");
    }
    else {
        return stack[top--];
    }
}

char* reverse(char* s) {
    const int len = sizeof(s) + 1;
    char* rstring = new char[len];
    initialize();
    for (int i = 0; i < len; i++) {
        push(s[i]);
    }
    int tmp = 0;
    while(isEmpty()==false){
        rstring[tmp++]=pop();
    }
    for (int i = 0; i < len; i++) {
        printf("%c\n", rstring[i]);
    }
    return rstring;
}

void main() {
    char* str1 = "apple";
    char* str2 = reverse(str1);

    printf("before : %s \n", str1);
    printf("after : %s \n", str2);
    getchar();
}

the result is here我得到了答案(elppa),但它也打印出了一些我不打算的其他角色。为什么我得到这个东西?它可能与内存数组或其他东西有关,但不确切知道发生了什么内存。如何解决问题?

2 个答案:

答案 0 :(得分:2)

您尚未考虑字符串终止字符'\0'。您正在使用带有printf的%s打印sting。

在展开堆栈后计算了rstring后,您应该将'\0'附加到rstring。希望这能解决您的问题。

答案 1 :(得分:1)

通过使用sizeof,您将获得data_type大小(在本例中为char *的大小),以字节为单位。您应该使用strlen代替。