消除反斜杠

本文探讨了strchr和_tcschr函数在处理多字符集时可能遇到的问题,特别是当涉及到特定字符查找及字符串结尾判断时的错误用法,并提供了正确的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; //删除最后的'//'
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值