基于C++怎么实现去除字符串头尾指定字符功能
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本文小编为大家详细介绍"基于C++怎么实现去除字符串头尾指定字符功能",内容详细,步骤清晰,细节处理妥当,希望这篇"基于C++怎么实现去除字符串头尾指定字符功能"文章能帮助大家解决疑惑,下面跟着小编的
千家信息网最后更新 2025年11月08日基于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安全错误
数据库的锁怎样保障安全
数据库单元测试
数据库新建的表格在哪儿
数据库 form json
上海信息化软件开发销售
网络安全四不发生
电脑安装什么数据库
华为网络安全六条禁令
天津互联网软件开发中心
eps数据存入数据库
openwrt 打印服务器
两全其美网络安全宣传周
证券公司从事软件开发怎么样
1.18.2我的世界服务器地址
哈工程的网络安全专业
北京朝阳网络安全
数据库管理支持哪些模型
网络技术方面课程论文
如何设置打开数据库
数据库连接对象指的是什么
广东软件开发价钱是多少
英特尔软件开发人员占比
数据库技术支持面试
共享售货机的软件开发商
香港服务器免费ip地址最新
二本软件开发大学有哪些问题
小型互联网科技公司怎么样
java小型数据库
西安松毅软件开发
1.18.2我的世界服务器地址
r连数据库