使用堆栈反转字符串(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
范围之外写入,将会出现未定义的行为。
我正在尝试反转字符串并将其显示在 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
范围之外写入,将会出现未定义的行为。