我无法在VC ++ 2010中将String转换为char数组

时间:2015-03-20 16:57:23

标签: c++-cli

我在VC ++中尝试Caesar密码程序。 我尝试将String转换为char数组..但是当我显示它时它显示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);
}

2 个答案:

答案 0 :(得分:0)

我明白了。 改变只有一条线就创造了奇迹。

更改此行

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

label3-&gt; Text = gcnew String(msg,0,100);

答案 1 :(得分:0)

这是一个简单的实现:

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();
}

请参阅?因为你没有调用本机代码,所以根本不需要编组。

您的原始代码泄漏了内存,因为您在未调用Marshal::StringToHGlobalAnsi的情况下致电Marshal::FreeHGlobal

  

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

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