C++ cli 我无法在VC+;中将字符串转换为字符数组+;2010
我正在用VC++编写凯撒密码程序。 我尝试将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
字符串
转换为字符数组。。但当我显示它时,它正在显示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.。但是我找不到你。你能告诉我如何处理吗字符串可以在不封送的情况下转换为字符?请告诉我您是如何发现我的代码正在泄漏内存的?对不起,我对编码是新手。我提供了一个答案来解释这一点。