2

我尝试将 String^ 转换为基本字符串...但是在此代码之后出现错误。这是什么意思,我该如何解决?我需要将基本字符串输入到类构造函数中。字符串 ^ 不起作用。

System::String^ temp = textBox1->Text;
string dummy = System::Convert::ToString(temp);
错误 C2440:“正在初始化”:无法从“System::String ^”转换为“std::basic_string”
1> 与
1> [
1> _Elem=字符,
1> _Traits=std::char_traits,
1> _Ax=std::分配器
1>]
1> 没有构造函数可以采用源类型,或者构造函数重载决议不明确
4

6 回答 6

9

你需要编组你的字符串。托管字符串位于托管堆上的某个位置(垃圾收集器可以自由移动它)。

将字符串获取到本机端的一种方法如下:

using System::Runtime::InteropServices::Marshal;

char *pString = (char*)Marshal::StringToHGlobalAnsi(managedString);
std::string nativeString(pString); // make your std::string
Marshal::FreeHGlobal(pString);     // don't forget to clean up

如果您使用的是 Visual Studio 2008,则可以利用更好的编组实用程序。查看此 MSDN 页面

#include <msclr/marshal.h>
#include <msclr/marshal_cppstd.h>

using namespace msclr::interop;

std::string nativeString(marshal_as<std::string>(managedString));
于 2009-04-22T05:06:39.387 回答
3

我花了 11 小时寻找解决方案:

 #include <stdlib.h
 #include <string.h>
 #include <msclr\marshal_cppstd.h>
 //ListaQuad<int> prueba;
 //..
 using namespace msclr::interop;
 //..
 System::String^ clrString = (TextoDeBoton);
 std::string stdString = marshal_as<std::string>(clrString);  //String^ to std
 //System::String^ myString = marshal_as<System::String^>(MyBasicStirng);   //std to String^ (no lo he probado, pero sería algo así.)
 prueba.CopyInfo(stdString); //MyMethod
 //..
 //where, String^ = TextoDeBoton;
 //and, stdString = normal string;
于 2010-12-12T13:37:01.880 回答
2

您需要做两件事才能将 a 转换System::String为 a std::string

  • 将托管堆中的内存编组为非托管堆。
  • 将您的字符编码从宽字符转换为(从您的问题来看)ansi 字符。

一种无需担心释放任何 HGlobal 内存的方法是按照以下方式定义一个方法:

interior_ptr<unsigned char> GetAsciiString(System::String ^s)
{
    array<unsigned char> ^chars = System::Text::Encoding::ASCII->GetBytes(s);
    return &chars[0];
    // of course you'd want to do some error checking for string length, nulls, etc..
}

你会像这样使用它:

// somewhere else...
{
    pin_ptr<unsigned char> pChars = GetAsciiString(textBox1->Text);
    std:string std_str(pChars); // I don't have my compiler in front of me, so you may need a (char*)pChars
}

这也允许您使用您选择的编码(例如 utf-8 over ascii),但您可能并不真正需要它。

于 2009-04-22T06:08:45.710 回答
1

可能是,您需要从std::string到 进行反向转换String^。我正在搜索这个转换,但我没有找到。所以,我写了。我希望它对某人有用:

String^ stdStringToPlatformString(string stdString){
    const size_t newsizew = strlen(stdString.c_str()) + 1;
    size_t convertedChars = 0;
    wchar_t *ch1 = new wchar_t[newsizew];
    mbstowcs_s(&convertedChars, ch1, newsizew, stdString.c_str(), _TRUNCATE);
    String ^platformString;
    platformString = ref new Platform::String(ch1, newsizew);
    return platformString;
}    
于 2014-10-24T05:35:49.277 回答
0

我想你也可以这样做:

string dummy = string( textBox1->Text );

查看如何:在 MSDN 上的各种字符串类型之间进行转换。

于 2009-04-22T05:36:12.420 回答
0
string platformStringToStdString(String ^input){
    int size=input->Length()+1;
    char* auxiliary=(char *)malloc(sizeof(char)*size);
    wcstombs_s(NULL,auxiliary,size,input->Data(),_TRUNCATE);
    string result(auxiliary);
    free(auxiliary);
    return result;
}
于 2013-03-12T16:38:58.073 回答