我在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);
}
答案 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
相反的功能。
这应该是你自动的:当你分配非托管内存时,你有责任释放它。