頭段時間有人問過我這個問題,但是我一點頭緒都沒有,直接說不會。如今從網上找了點資料,看了看,知道點東西了。html
1、string轉char*。node
主要有三種方法能夠將str轉換爲char*類型,分別是:data(); c_str(); copy();c++
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*的類型。windows
下面解釋下該問題,const char*是不能直接賦值到char*的,這樣編譯都不能經過,理由:假如能夠的話,那麼經過char*就能夠修改const char指向的內容了,這是不容許的。因此char*要另外開闢新的空間,即上面的形式。安全
2.c_str()方法,如:ide
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’;//注意手動加結束符!!!
2、char * 轉string。測試
能夠直接賦值。idea
1 string s; 2 char *p = "hello";//直接賦值 3 s = p;
這裏有一點要說明,當聲明瞭string類型變量s後,用printf("%s",s);是會出錯的,由於「%s」要求後面的對象的首地址。可是string不是這樣的一個類型。因此確定出錯。
3、string轉char[]
這個因爲咱們知道string的長度,能夠根據length()函數獲得,又能夠根據下標直接訪問,因此用一個循環就能夠賦值了。
1 string pp = "dagah"; 2 char p[8]; 3 int i; 4 for( i=0;i<pp.length();i++) 5 p[i] = pp[i]; 6 p[i] = '\0'; 7 printf("%s\n",p); 8 cout<<p;
4、char[]轉string
這裏能夠直接賦值。
1. char*->string
(1)直接轉換
const char* nodename; string temp = nodename;
string temp2(nodename);
2. wchar_t*->wstring
(1)直接轉換
const wchar_t* nodename; wstring temp = nodename;
wstring temp2(nodename);
3. string->char*
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*
方法一:
string temp;
const char* nodename = temp.c_str();
方法二:
struct IPAddress{ std::wstring hostname; std::vector<std::wstring> ips; }; scripting::IPAddress dns = (*pPreloadDns)[i]; AnsiString strA = dns.hostname.c_str(); char * hn = strA.c_str();
但聽說這樣很不可靠(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*
方法一:
wstring temp;
wchar_t* nodename = temp.c_str();
方法二.一:
struct IPAddress{ std::wstring hostname; std::vector<std::wstring> ips; }; scripting::IPAddress dns = (*pPreloadDns)[i]; UnicodeString strA = dns.hostname.c_str(); //char * hn = strA.c_str(); wchar_t * hn = strA.c_str();
方法二.二:
struct IPAddress{ std::wstring hostname; std::vector<std::wstring> 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:") << addr); con->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:") << addr); con->setIP(addr);
下面關於string,wstring互轉的方法是錯誤的。對ansi字符可能能獲得正確結果,但若是傳入的參數是「中文」字符串,將得不到正確的結果。
7. string->wstring
static wstring Str2Wstr (string str ) { if (str.length() == 0) return L""; std::wstring wstr; wstr.assign (str.begin(), str.end()); return wstr; }
8. wstring->string
static string Wstr2Str(wstring wstr ) { if (wstr.length() == 0) return ""; std::string str; str.assign (wstr.begin(), wstr.end()); return str; }
正確的作法是使用MultiByteToWideChar和WideCharToMultiByte:
9. string->wstring
std::wstring stringToWstring(const std::string& str) { LPCSTR pszSrc = str.c_str(); int nLen = MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, 0); if (nLen == 0) return std::wstring(L""); wchar_t* pwszDst = new wchar_t[nLen]; if (!pwszDst) return std::wstring(L""); MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen); std::wstring wstr(pwszDst); delete[] pwszDst; pwszDst = NULL; return wstr; }
10. wstring->string
std::string wstringToString(const std::wstring& wstr) { LPCWSTR pwszSrc = wstr.c_str(); int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen == 0) return std::string(""); char* pszDst = new char[nLen]; if (!pszDst) return std::string(""); WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL); std::string str(pszDst); delete[] pszDst; pszDst = NULL; return str; }
測試代碼:
int _tmain(int argc, _TCHAR* argv[]) { std::string str = "中文"; std::wstring wstr = L"中文"; std::string str1 = ""; std::wstring wstr1 = L""; LPCSTR pSrc = "中文"; LPCWSTR pwzSrc = L"中文"; stringToWstring(str); wstringToString(wstr); stringToWstring(str1); wstringToString(wstr1); stringToWstring(pSrc); wstringToString(pwzSrc); return 0; }
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
第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;
}
std::string 與 std::wstring 轉換方法的效率比較(轉)
轉自:http://blog.csdn.net/goof/article/details/7662652
輸出:
Time:78ms
Time:94ms
Time:62ms
Time:109ms
從輸出結果能夠看出
WideCharToMultiByte和 MultiByteToWideChar轉換效率要比 mbstowcs和wcstombs高。
注意:若是使用mbstowcs則須要Disable Specific Warnings: 4996
示例代碼:轉自:http://codereview.stackexchange.com/questions/419/converting-between-stdwstring-and-stdstring
Here's a cross platform version I've written for a framework I'm working on, it uses the UTF8 code page but fell free to change as needed. This is a slimmed version as it doesn't contain all of the explicit macro definitions, but you can get the idea from it:
Here's an example using it:
std::string s = "here's a standard string"; std::wstring w = L"here's a wide string"; std::string sw = omni::string::to_string(w); std::wstring ws = omni::string::to_wstring(s); std::cout << "s = " << s << std::endl; std::wcout << "w = " << w << std::endl; std::cout << "sw = " << sw << std::endl; std::wcout << "ws = " << ws << std::endl;