C++ wstring string char* wchar |
您所在的位置:网站首页 › string怎么赋值给char › C++ wstring string char* wchar |
头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会。现在从网上找了点资料,看了看,知道点东西了。 一、string转char*。 主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy(); 1.data()方法,如: 1 string str = "hello"; 2 const char* p = str.data();//加const 或者用char * p=(char*)str.data();的形式同时有一点需要说明,这里在devc++中编译需要添加const,否则会报错invalid conversion from const char* to char *,这里可以再前面加上const或者在等号后面给强制转化成char*的类型。 下面解释下该问题,const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const char指向的内容了,这是不允许的。所以char*要另外开辟新的空间,即上面的形式。 2.c_str()方法,如: 1 string str=“world”; 2 const char *p = str.c_str();//同上,要加const或者等号右边用char*3.copy()方法,如: 1 string str="hmmm"; 2 char p[50]; 3 str.copy(p, 5, 0);//这里5代表复制几个字符,0代表复制的位置, 4 *(p+5)=‘\0’;//注意手动加结束符!!!
二、char * 转string。 可以直接赋值。 1 string s; 2 char *p = "hello";//直接赋值 3 s = p;这里有一点要说明,当声明了string类型变量s后,用printf("%s",s);是会出错的,因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。
三、string转char[] 这个由于我们知道string的长度,可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了。 ![]() wstring->char* 方法一: (1)将wstring.c_str()转为wchar_t* 方法二: (1)将string.c_str(), wstring.c_str()转为AnsiString(http://blog.csdn.net/bannico/article/details/7577728), (2)将AnsiString.c_str()转为char* ![]() ![]() ![]() ![]() 但据说这样很不可靠(http://bbs.csdn.net/topics/30479944),安全的做法是: 方法三:String str="123456"; int len=str.Length(); char *cp=new char[len+1]; StrPCopy(cp, str);4. wstring->wchar_t* string->w_char*(参见5) 方法一: (1)将wstring.c_str()转为wchar_t* 方法二.一: (1)将wstring.c_str()转为UnicodeString (2)将UnicodeString.c_str()转为wchar_t* 方法二.二: (1)将wstring.c_str()转为AnsiString (2)使用ANSIToUnicode方法将AnsiString.c_str()转为wchar_t* ![]() ![]() 方法二.二: struct IPAddress{ std::wstring hostname; std::vector ips; }; scripting::IPAddress dns = (*pPreloadDns)[i]; AnsiString strA = dns.hostname.c_str(); //char * hn = strA.c_str(); wchar_t * hn = ANSIToUnicode(strA.c_str());![]() ![]() 5. char*->UnicodeString->wstring, wchar_t* (1)将char*转为UnicodeString (2)将UnicodeString.c_str()转为wstring, wchar_t* UnicodeString temp(inet_ntoa(pAddr->sin_addr)) ; //inet_ntoa returns char*std::wstring addr(temp.c_str());wchar_t* addr2 = temp.c_str();log_debug(_T("set connection ip:") setIP(addr);6. wchar_t*->AnsiString->string, char* (1)将wchar_t*转为AnsiString (2)将AnsiString.c_str()转为string, char* wchar_t* str = wstring.c_str();AnsiString temp(str ) ; //inet_ntoa returns char* std::string addr(temp.c_str());char* addr2 = temp.c_str();log_debug(_T("set connection ip:") setIP(addr);下面关于string,wstring互转的方法是错误的。对ansi字符可能能得到正确结果,但如果传入的参数是“中文”字符串,将得不到正确的结果。 7. string->wstring ![]() ![]() ![]() ![]() 8. wstring->string ![]() ![]() ![]() ![]() 正确的做法是使用MultiByteToWideChar和WideCharToMultiByte: 9. string->wstring ![]() ![]() ![]() ![]() 10. wstring->string ![]() ![]() ![]() ![]() 测试代码: ![]() ![]() ![]() ![]()
Original URL: http://www.cnblogs.com/zhcncn/archive/2013/05/20/3089084.html wstring与string相互转换 转自:http://www.cnblogs.com/SunboyL/archive/2013/03/31/stringandwstring.html ![]()
VS2005:C++ std::string, std::wstring转换方法(转) 转自:http://blog.sina.com.cn/s/blog_700a65cc0100migm.html 随着VS2003升级到VS2005,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看vs2003 到vs2005代码升级要点)。其中根字符串相关的内容是,wcout不再有效,默认参数传递方式由char*改成了wchar_t*等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种C++ std::string和std::wstring相互转换的转换方法。 第0种方法,更新于(2009年3月22):好久不用windows,好久不用VS.net了。今天网上查找资料,看到下述实现,记录未验证。(抽空去验证了一下,这个,好像对中文无效...)std::wstring s2ws(const std::string& s){ std::wstring temp(s.length(),L‘ ‘); std::copy(s.begin(), s.end(), temp.begin()); return temp;} std::string ws2s(const std::wstring& s){ std::string temp(s.length(),‘ ‘); std::copy(s.begin(), s.end(), temp.begin()); return temp;} 第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》): #include #include usingnamespace std; //Converting a WChar string to a Ansi string std::string WChar2Ansi(LPCWSTR pwszSrc) { int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |