基于C++怎么实现去除字符串头尾指定字符功能
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文小编为大家详细介绍"基于C++怎么实现去除字符串头尾指定字符功能",内容详细,步骤清晰,细节处理妥当,希望这篇"基于C++怎么实现去除字符串头尾指定字符功能"文章能帮助大家解决疑惑,下面跟着小编的
千家信息网最后更新 2026年11月02日基于C++怎么实现去除字符串头尾指定字符功能
本文小编为大家详细介绍"基于C++怎么实现去除字符串头尾指定字符功能",内容详细,步骤清晰,细节处理妥当,希望这篇"基于C++怎么实现去除字符串头尾指定字符功能"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、从头部开始去除指定字符
首先从头遍历,直到遇见第一个非指定字符,此后将后续字符按顺序逐一前移。
// 实现方式一void TrimHead(char* pszSrc, char chTrim){ if(NULL == pszSrc) return; // 从头部开始跳过chTrim指定的字符 int i = 0; char* psz = pszSrc; while (*psz && *psz == chTrim) { i++; psz++; } // 从psz开始将后面字符逐一拷贝到前面 i = 0; while(*psz) { *(pszSrc+i) = *psz; i++; psz++; } *(pszSrc+i) = 0;}上述函数中,在找到第一个非指定字符后,通过while函数逐一前移字符,如果后续字符串很长的话,性能是不是会比较低?我们改进一下,使用memmove函数替换while操作,下面是实现方法,代码更加简洁易读。
// 实现方式二void TrimHeadEx(char* pszSrc, char chTrim){ if(NULL == pszSrc) return; // 从头部开始跳过chTrim指定的字符 int iStrLen = strlen(pszSrc); char* psz = pszSrc; while (*psz && *psz == chTrim) psz++; // psz指向第一个非指定字符的位置 if(psz != pszSrc) { // 计算新字符串长度 iStrLen = iStrLen - (psz - pszSrc); memmove(pszSrc, psz, (iStrLen+1)); // +1表示将末尾的0也一并拷贝 }}方法二的代码要比方法一的简洁,那么它的速度会比方法一的快么?文末会给出答案。
二、去除尾部指定的字符
// 实现方式一void TrimTail(char* pszSrc, char chTrim){ if(NULL == pszSrc) return; char* psz = pszSrc; char* pszLast = NULL; // 从头开始遍历直到整个字符串结束 while(*psz) { // 遇到指定字符,则用pszLast记住该位置 if(*psz == chTrim) { if(NULL == pszLast) pszLast = psz; } else pszLast = NULL; psz++; } // 如果找到末尾的第一个指定字符,则作为字符串的结尾 if(pszLast != NULL) *pszLast = 0;}上述方法中,我们需要遍历完整个字符串,如果字符串很长的话,或者遇到极端情况,就是结尾没有指定字符时,也要将整个字符串遍历完毕。显然这种实现方式的效率并不高。 那么我们改进一下算法,从字符串的尾部进行遍历。
// 实现方式二void TrimTailEx(char* pszSrc, char chTrim){ if(NULL == pszSrc) return; // 从尾部开始跳过chTrim指定字符 int iStrLen = strlen(pszSrc); char* pszStr = pszSrc; int iLastIdx = iStrLen - 1; while(iLastIdx >= 0 && *(pszStr+iLastIdx) == chTrim) iLastIdx--; // 计算新字符串长度并在结尾赋值为0 iStrLen = iLastIdx+1; *(pszSrc+iStrLen) = 0;}上述实现方式是从字符串的尾部进行遍历,实现的方式也更加的简洁。如果结尾没有指定字符,该函数会在遍历第一个字符后就退出,性能显然要好过方式一。
那么对于TrimHead和TrimTail的两种实现,方式二和方式一到底谁快呢?是不是和我们想象的一样有差距或者差距很大呢?
三、测试比较
这里写了一个测试函数TestSpeedTrim,为了让时间更加明显,在该函数中设置的循环次数为10000000。大家可以亲自运行测试一下,看看debug和release两个版本的差异,结果一定会让你吃惊,可能和你想的并不一样哦。
#include#include #include #include void TestSpeedTrim(bool bTrimHead){ char szTrim1[256] = {0}; char szTrim2[256] = {0}; char* pszOrigin = " This is a trim test head/tail "; strcpy(szTrim1, pszOrigin); strcpy(szTrim2, pszOrigin); int i = 0; int iCount = 10000000; clock_t cStart = 0; // 第一种Trim方法 cStart = clock(); for(i = 0; i < iCount; i++) { bTrimHead ? TrimHead(szTrim1, ' ') : TrimTail(szTrim1, ' '); } clock_t cSpan1 = clock() - cStart; // 第二种Trim方法 cStart = clock(); for(i = 0; i < iCount; i++) { bTrimHead ? TrimHeadEx(szTrim2, ' ') : TrimTailEx(szTrim2, ' '); } clock_t cSpan2 = clock() - cStart; printf("cSpan1 = %d, cSpan2 = %d\r\n", cSpan1, cSpan2); printf("szTrim1=[%s]\r\n", szTrim1); printf("szTrim2=[%s]\r\n", szTrim2);}int main(int argc, char* argv[]){ // 测试头 printf("删除头部的空字符:\r\n"); TestSpeedTrim(true); // 测试尾 printf("\r\n删除尾部的空字符:\r\n"); TestSpeedTrim(false); getchar(); return 0;}
读到这里,这篇"基于C++怎么实现去除字符串头尾指定字符功能"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
字符
字符串
方式
方法
函数
尾部
测试
头部
功能
头尾
C++
简洁
文章
从头
代码
位置
内容
差距
性能
拷贝
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网络科技
互联网科技图片
互联网科技工作委员会
互联网科技工作委员会毛军
互联网科技的英文
亿策互联网科技
深圳齐家互联网科技
致聘互联网科技
深圳艾佳互联网科技
成都狮子座互联网科技
互联网巨头投资的硬核科技
互联网科技公司实习生
千方科技属于互联网企业吗
互联网科技商业
威龙国际互联网科技公司
互联网科技快讯热点
互联网科技手抄报图片
西安左小互联网科技有限公司
河南商务圈互联网科技有限公司
承德科技产业互联网平台
互联网金融 科技金融
齐家互联网科技
唐信互联网科技
互联网科技的未来发展
海南科技产业互联网平台
互联网科技公司需要的职位
如何创新互联网科技
明优互联网科技有限公司
工业互联网展湾科技股份有限公司
全球科技与互联网公司市值变化