文本从文本框转换为char*(转换/封送)

Text from Textbox to char* (converting/marshal)

本文关键字:转换 文本 封送 char      更新时间:2023-10-16

当前我正忙于从文本框中获取一些文本,然后将其转换为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);

在这里,您可以找到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不包含文件allready的地址,而是包含地址+一些垃圾。此外,您根本不需要这条线路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);

您在对Marshal::FreeHGlobal():的调用中没有键入casting host2

System::String^ host = textBoxHostadres->Text;
const char* host2 = (const char*)(void*)Marshal::StringToHGlobalAnsi(host);
system(host2);
traceroute hostAddress(host2);
Marshal::FreeHGlobal((IntPtr) host2);