C++ 字符集unicode和多字节的数据类型差别很大,搞这个费了好长的功夫。就把过程中遇到的问题记录下,大都是网上找的,链接太多七七八八也不好贴是哪位博主了,主要方便自己查阅,投个原创请见谅
1. const char* 字符串 以 “\0”结尾。
2. char[] 字符串 以 “\0”结尾。
3.string 字符串 不以 “\0”结尾。
4. char[n] = "string", 当string 长度+“\0”>n时,会因空间不足出错。
5.string.c_str() 转 const char* 时, 会在字符串末尾 自动补“\0”
6.char* 转string 时, 会自动把末尾的 “\0” 去掉。
7.strlen()是取字符串除去结尾符 “\0” 的长度。
8.sizeof()是包含‘\0’的长度
9.带有‘\0’和不带有‘\0’的两个字符串是无法相等的。
1.const char * 转 wchar_t*类型:
//const char*转wchar_t*
wchar_t* charToWChart(const char *str)
{
int length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
return t;
}
2.std::string字符串替换
//替换字符串
//@param: pszSrc:原先字符串
//@param: pszOld:需要替换的字符串
//@param: pszNew:替换的新字符串
//@return:替换完成的字符串
static std::string replace_str(const char *pszSrc, const char *pszOld, const char *pszNew)
{
std::string strContent, strTemp;
strContent.assign( pszSrc );
std::string::size_type nPos = 0;
while( true )
{
nPos = strContent.find(pszOld, nPos);
strTemp = strContent.substr(nPos+strlen(pszOld), strContent.length());
if ( nPos == std::string::npos )
{
break;
}
strContent.replace(nPos,strContent.length(), pszNew );
strContent.append(strTemp);
nPos +=strlen(pszNew) - strlen(pszOld)+1; //防止重复替换 避免死循环
}
return strContent;
}
3.char*转std::wstring
std::wstring charToWstring(char* szIn)
{
int length = MultiByteToWideChar(CP_ACP, 0, szIn, -1, NULL, 0);
WCHAR* buf = new WCHAR[length+1];
ZeroMemory(buf, (length + 1) * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, szIn, -1, buf, length);
std::wstring strRet(buf);
delete[] buf;
return strRet;
}
4.wchar_t*转std::string
std::string w2a(wchar_t* szIn)
{
int nSize = WideCharToMultiByte(CP_ACP, 0, szIn, -1, NULL, NULL, NULL, NULL);
char* buffer = new char[nSize+1];
ZeroMemory(buffer,nSize+1);
WideCharToMultiByte(CP_ACP, 0, szIn, -1, buffer, nSize, NULL, NULL);
std::string strRet(buffer);
delete[] buffer;
return strRet;
}
5.std::string判断结尾是否包含某字符:
//判断字符串结尾是否包含某字符;
//[in]s:字符串,[in]sub:包含字符
//return:1:包含 0:包含
bool endsWith(std::string s, std::string sub) {
return s.rfind(sub) == (s.length() - sub.length()) ? true : false;
}
6.分割字符串
//分割字符串
std::vector<std::string> split_str(std::string str, std::string pat)
{
std::vector<std::string> bufStr;
while (true)
{
int index = str.find(pat);
std::string subStr = str.substr(0, index);
if (!subStr.empty())
bufStr.push_back(subStr);
str.erase(0, index + pat.size());
if (index == -1)
break;
}
return bufStr;
}
在字符串无法直接赋值使用_T
CString = _T("test");
下面常见错误
char *getstr1()
{
char s[]="str1";
return s;
}
int main()
{
char* s1;
s1 = getstr1();
printf("%s",s1);
return 0;
}
程序报错
warning: address of local variable ‘s’ returned [-Wreturn-local-addr]
char s[]=“str1”;
原因:在函数内部定义变量,并返回
这样函数内部定义的变量在函数结束时被释放掉,所以返回是找不到的。
改为
static char s[]=“str1”;就不会了,警告消除