使用堆栈反转字符串(C++/CLI Visual Studio 2010)

Reversing a String using a Stack (C++/CLI Visual Studio 2010 )

我正在尝试反转字符串并将其显示在 visual studio 2010 (C++) 的消息框中。问题是输出包含带有更多字符的反转字符串。

当我尝试反转 "Hello" 时,输出应该是 "olleH" 但输出是 "olleHBYrHello"

这是我的堆栈class实现

#include "StdAfx.h"
#include "StackX.h"
#include <iostream>
using namespace std;

StackX::StackX(int size)
{
    maxSize = size;
    top = -1;
    stackArray = new char[maxSize];
}
bool StackX::isFull()
{
    if(top == maxSize - 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
bool StackX::isEmpty()
{
    if(top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
void StackX::push(char c)
{
    if(isFull())
    {
        System::Windows::Forms::MessageBox::Show("Stack is full");
    }
    else
    {
        stackArray[++top] = c;

    }
}
char StackX::pop()
{
    if(isEmpty())
    {
        System::Windows::Forms::MessageBox::Show("Stack is empty");
        return -99;
    }
    else
    {
        return stackArray[top--];
    }
}

这是主要代码(为按钮点击事件编写)

char text[] = "Hello";
char reverse[5];
StackX s(5);

for(int i = 0; i < 5; i++)
{
    s.push(text[i]);
}
for(int i = 0; i < 5; i++)
{
    reverse[i] = s.pop();
}

String^ str = gcnew String(reverse);
MessageBox::Show(str);

Headers 包含在 main

#pragma once
#include "StackX.h"
using namespace std;
using namespace System;

您忘记在字符串末尾添加空值。
C/C++ 是空终止字符串,所以如果你不以空终止它,消息框将只显示内存中的所有字符,直到它达到空值。

for(int i = 0; i < 5; i++)
{
    reverse[i] = s.pop();
}
reverse[5] = NULL;

您需要在 char* 的末尾添加一个 EOS 字符 ([=10=]) 以标记字符串的末尾。

您需要在 reverse 字符串中添加 '\0' 以标记其结束。否则它将 output/copy 来自 reverse 的所有字符,直到找到 '\0'。

int i;
for(i = 0; i < 5; i++)
{
    reverse[i] = s.pop();
}

reverse[i] = '[=10=]';

重新考虑改变这个

char reverse[5];

对此

char reverse[sizeof(text)];

否则,如果您在 reserve 范围之外写入,将会出现未定义的行为。