基于C++怎么实现去除字符串头尾指定字符功能
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本文小编为大家详细介绍"基于C++怎么实现去除字符串头尾指定字符功能",内容详细,步骤清晰,细节处理妥当,希望这篇"基于C++怎么实现去除字符串头尾指定字符功能"文章能帮助大家解决疑惑,下面跟着小编的
千家信息网最后更新 2025年01月18日基于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安全错误
数据库的锁怎样保障安全
intranet服务器
闵行区软件开发使用方法
网络安全宣传周问题排查
软件开发人效比
APP软件开发软件公司
网络安全概念股为何跌
云端服务器英语怎么说
服务器如何进行测试
逃离塔科夫俄区能改服务器吗
数据库基础及应用期末答案
哪里的服务器安全模式
淘宝使用的数据库是哪个
网络技术学院都有什么专业
网络安全互通视频
网络安全板报
数据库一键安装
加减乘除小运算 网络安全大民生
安全狗怎么连接远程服务器
数据库文件编码错误
禅道数据库 bug统计
可靠的网络安全等保
辽宁金税盘安全服务器接入地址
连接access本地数据库
娄底哪里有软件开发
安徽慧暖软件开发有限公司
批量管理服务器带web界面
显示有阻止网络安全证书
阿里云服务器如何打印
数据库中的宏
数据库高级运用