strchr函数由于没有对多字符集合做处理,在某些情况下会造成未知的后果,比如:
char szTest[] = "圧縮";
char* p1 = _tcschr(szTest, 'R'); //p1 == NULL
char* p2 = strchr(szTest, 'R'); //p2 != NULL
类似的情况还有,不能通过判断末尾的字符是否等于/来确定字符串是否以/结尾
TCHAR szBuffer[MAX_PATH + 1] = {0};
lstrcpyn(szBuffer, _T("c://aaa//衆"), MAX_PATH);
char ch = szBuffer[lstrlen(szBuffer) - 1]; //ch == '//' 但是实际上字符串并没有以/结尾
char* p = _tcsrchr(szBuffer, _T('//')); //p 指向"//衆"
同样的,CString也存在相同问题
CString strBuffer = _T("c://aaa//衆");
CString str = strBuffer.Right(1); //str居然也会等于"//"
应该用下列代码判断是否是/结尾
if ((strBuffer.ReverseFind(_T('//')) == strBuffer.GetLength() - 1) && (!strBuffer.IsEmpty()))
; //可以肯定末尾是'//'
如果只是单纯的删除末尾的'//'则可以使用
strBuffer.TrimRight(_T('//'));
如果不用CString则使用
TCHAR* pszLastBackslash = _tcsrchr(szBuffer, _T('//'));
if (pszLastBackslash && pszLastBackslash - szBuffer == lstrlen(szBuffer) - 1)
*pszLastBackslash = 0; //删除最后的'//'
或者
if (pszLastBackslash && !pszLastBackslash[1])
*pszLastBackslash = 0; //删除最后的'//'