目前我很忙从文本框中获取一些文本然后转换为const char *。我有以下代码:
System::String^ host = textBoxHostadres->Text;
const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
//system(host2); //What to do with this?
Marshal::FreeHGlobal(host2);
它在 Marshal::FreeHGlobal
下提供了红线(Visual Studio 2012)。有人可以给我一个正确的方向来从textbox
获取文本并将其发送到const char*
吗?第一行运行良好,通过调试我看到文本被捕获。
更新
System::String^ host = textBoxHostadres->Text;
pin_ptr<const wchar_t> wch = PtrToStringChars(host);
// Convert to a char*
size_t origsize = wcslen(wch) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char nstring[newsize];
wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
strcat_s(nstring, " (char *)");
const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
system(host2);
traceroute hostAddress(host2);
答案 0 :(得分:0)
Here您将在 char *,wchar_t *,_bstr_t,CComBSTR,CString,basic_string和System.String之间找到所有可能的转换。
涵盖的字符串类型包括char *,wchar_t *,_bstr_t,CComBSTR,CString,basic_string和System.String。在所有情况下,转换为新类型时都会生成字符串的副本。对新字符串所做的任何更改都不会影响原始字符串,反之亦然。
关于您添加的EDIT:
如果您至少可以尝试理解复制粘贴的代码,那将是很好的。这一行strcat_s(nstring, " (char *)");
会为您的字符串添加一些字符,主要是(char *)
,这显然是因为您的nstring
不包含文件的地址,但是地址+一些垃圾。此外,您根本不需要此行std::cout << nstring << std::endl;
。
这就是你的实现应该是这样的。
System::String^ host = textBoxHostadres->Text;
pin_ptr<const wchar_t> wch = PtrToStringChars(host);
// Convert to a char*
size_t origsize = wcslen(wch) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char nstring[newsize]; // nstring is an array of chars
wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);
// strcat_s(nstring, " (char *)"); this line adds trash to your nstring!!!
traceroute hostAddress(nstring);
答案 1 :(得分:0)
您在host2
的电话中没有打字Marshal::FreeHGlobal()
:
System::String^ host = textBoxHostadres->Text;
const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
system(host2);
traceroute hostAddress(host2);
Marshal::FreeHGlobal((IntPtr) host2);