C++ cli 我无法在VC+;中将字符串转换为字符数组+;2010

C++ cli 我无法在VC+;中将字符串转换为字符数组+;2010,c++-cli,C++ Cli,我正在用VC++编写凯撒密码程序。 我尝试将字符串转换为字符数组。。但当我显示它时,它正在显示true private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e){ System::String^ plain=(textBox1->Text); int i,j; char* msg = (char*)Marshal::StringToHGlob

我正在用VC++编写凯撒密码程序。 我尝试将
字符串
转换为字符数组。。但当我显示它时,它正在显示
true

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e){        
    System::String^ plain=(textBox1->Text);
    int i,j;
    char* msg = (char*)Marshal::StringToHGlobalAnsi(plain).ToPointer();     
    int length=strlen(msg);

    for(i=0;i<length;i++)
    {
        if(isalpha(msg[i]))
        {
            msg[i]=tolower(msg[i]);
            for(j=0;j<3;j++)
            {
                if(msg[i]=='z')
                {
                    msg[i]='a';
                }
                else
                {
                    msg[i]++;
                }
            }
        }
     }    

    label3->Text=System::Convert::ToString(msg);
}
private:System::Void按钮1\u单击(System::Object^sender,System::EventArgs^e){
系统::字符串^plain=(textBox1->Text);
int i,j;
char*msg=(char*)封送:StringToHGlobalAnsi(普通).ToPointer();
int length=strlen(msg);
对于(i=0;i我算出了。
一句话的变化创造了奇迹

换行

label3->Text=System::Convert::ToString(msg);into


label3->Text=gcnewstring(msg,0100);下面是一个简单的实现:

static String^ CaesarCipher(String^ input, int shift)
{
    const int numLetters = 'z' - 'a' + 1;
    shift = shift % numLetters;

    auto sb = gcnew System::Text::StringBuilder(input->Length);

    for each (auto c in input)
    {
        if (c >= 'a' && c <= 'z')
        {
            c += shift;

            if (c > 'z')
                c -= numLetters;
            else if (c < 'a')
                c += numLetters;
        }
        else if (c >= 'A' && c <= 'Z')
        {
            c += shift;

            if (c > 'Z')
                c -= numLetters;
            else if (c < 'A')
                c += numLetters;
        }

        sb->Append(c);
    }

    return sb->ToString();
}
static String^密码(String^输入,int移位)
{
常量int numLetters='z'-'a'+1;
班次=班次%numLetters;
auto sb=gcnew System::Text::StringBuilder(输入->长度);
对于每个(自动c输入)
{
如果(c>='a'和&c'z')
c-=纳姆莱特;
如果(c<'a'),则为else
c+=纳姆莱特;
}
如果(c>='A'&&c'Z')为else,则为
c-=纳姆莱特;
如果(c<'A'),则为else
c+=纳姆莱特;
}
sb->Append(c);
}
返回sb->ToString();
}
看到了吗?根本不需要封送处理,因为您没有调用本机代码

您的原始代码正在泄漏内存,因为您调用了
Marshal::StringToHGlobalAnsi
,而没有调用
Marshal::FreeHGlobal

StringToHGlobalAnsi
对于自定义封送或混合托管代码和非托管代码非常有用。由于此方法分配字符串所需的非托管内存,始终通过调用
FreeHGlobal
释放内存
StringToHGlobalAnsi
提供了与
封送相反的功能trToStringAnsi


这在你的脑海中应该是自动的:当你分配非托管内存时,你有责任释放它。

1.你的代码正在泄漏内存。2.这个方向的字符串封送是用。3.你一开始不需要封送,只需要使用
StringBuilder
.ya.。但是我找不到你。你能告诉我如何处理吗字符串可以在不封送的情况下转换为字符?请告诉我您是如何发现我的代码正在泄漏内存的?对不起,我对编码是新手。我提供了一个答案来解释这一点。