2017-01-10 67 views
1

我有使用堆棧結構反轉字符串的問題。使用堆棧反轉字符串

我做了一些代碼,以扭轉「蘋果」到「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),但它也印了一些其他字符是什麼我沒有打算。爲什麼我得到這個東西?它可能與內存數組有關,但不知道內存發生了什麼。如何解決這個問題?

+0

您暫時忽略了C字符串最後需要二進制零的情況,以便各種庫存代碼(本例中爲'printf')知道何時停止打印。 – usr2564301

+3

你不能通過'sizeof'獲得字符串長度!這個宏的返回長度是((char *))是4(或8)。在'reverse'函數中使用'strlen'函數。 –

+0

@HamidRezaMehrabian:很好看!所以前8個(我只是猜測)字符來自'sizeof',而第9個來自不終止字符串。 – usr2564301

回答

2

您還沒有考慮到字符串終止字符'\0'。您正在使用printf打印%s。

一旦展開堆棧後計算出rstring,您應該將附加到rstring。希望這會解決你的問題。

+0

哦,我插入推('\ 0');在推其他元素之前,我解決了我的問題。謝謝你,先生。 – timedeveloper

1

通過使用sizeof,您將獲得data_type大小(在此例中爲char *的大小)(以字節爲單位)。您應該使用strlen

+0

你是完全正確的先生,但它不能解決問題 – timedeveloper

+0

它是隨機的「奇怪的人物」還是隻是一個相同的人物? – dpw