プログラムにwstring,string,CStringのBufferにいったい何が残っているのか(菜鳥問題)

1961 ワード

本当に耻ずかしくて、「プログラムの中でwstring、string、CStringのBufferの中でいったい何が残っているのか」という菜鳥級の問題が分からなかった.
文字セットがMuiltiByteとUnicodeのそれぞれのプログラムでテスト
結果は次のとおりです.
MuiltiByteプログラムで
int main()
{
	string tmpStr = "abc";				//MuiltiByte
	wstring tmpStr3 = L"abc";			//Unicode
	string tmpStr1 = "  ";			//MuiltiByte
	wstring tmpStr2 = L"  ";			//Unicode

	char tmpCArr[255];
	memset(tmpCArr,0,255);
	WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)tmpStr2.c_str(), tmpStr2.length(), tmpCArr, 255, NULL, NULL) ;
	WCHAR tmpCArr1[255];
	memset(tmpCArr1,0,sizeof(tmpCArr1));
	MultiByteToWideChar(CP_ACP,NULL,tmpStr1.c_str(),tmpStr1.length(),tmpCArr1,255);

	CString tmpCStr1("  ");			//MuiltiByte
	CString tmpCStr2(L"  ");			//MuiltiByte
	CString tmpCStr3(_T("  "));		//MuiltiByte

	CString tmpCStr4("abc");			//MuiltiByte
	CString tmpCStr5(L"abc");			//MuiltiByte
	CString tmpCStr6(_T("abc"));		//MuiltiByte
}

Unicodeプログラムで
int main()
{
	string tmpStr = "abc";				//MuiltiByte
	wstring tmpStr3 = L"abc";			//Unicode
	string tmpStr1 = "  ";			//MuiltiByte
	wstring tmpStr2 = L"  ";			//Unicode

	char tmpCArr[255];
	memset(tmpCArr,0,255);
	WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)tmpStr2.c_str(), tmpStr2.length(), tmpCArr, 255, NULL, NULL) ;
	WCHAR tmpCArr1[255];
	memset(tmpCArr1,0,sizeof(tmpCArr1));
	MultiByteToWideChar(CP_ACP,NULL,tmpStr1.c_str(),tmpStr1.length(),tmpCArr1,255);

	CString tmpCStr1("  ");			//Unicode
	CString tmpCStr2(L"  ");			//Unicode
	CString tmpCStr3(_T("  "));		//Unicode

	CString tmpCStr4("abc");			//Unicode
	CString tmpCStr5(L"abc");			//Unicode
	CString tmpCStr6(_T("abc"));		//Unicode
}

結論:
異なる文字セットの下でstringとwstringの動作は同じで、stringは常にMuiltiByteを保存し、wstringは常にUnicodeを保存します.
CStringはあなたのこのプログラムの文字セットによって決定されます.