基于std::string的字符串处理

字符串操作库

/********************************************************************************************* * 文件:StringLib * 功能:基于的std::string实现的常用字符串操作,字符串分割,替换等 * 作者:张晓东 * 时间:2012-11-19 * 修改:2012-11-19完成初步版本,实现:字符串分割,字符串替换,提取文件路径,文件名字,文件扩展名 *********************************************************************************************/

#ifndef   _StringLib_h #define   _StringLib_h

#include <string> using namespace std;

#ifdef _cplusplus extern "C" { #endif

//从字符串str中,使用pattern进行分割,并存储到strVec中 bool StringSplit(std::string src, std::string pattern, std::vector<std::string>& strVec) {  std::string::size_type pos;     src +=pattern;//扩展字符串以方便操作     int size=src.size();    for(int i=0; i<size; i++)  {    pos = src.find(pattern,i);    if(pos<size)    {    std::string s=src.substr(i,pos-i);    strVec.push_back(s);    i=pos+pattern.size()-1;    }  }

 return true; }

//将字符串str中的所有target字符串替换为replacement bool StringReplace(std::string& src, std::string target, std::string replacement) {  std::string::size_type startpos = 0;   while (startpos!= std::string::npos)   {    startpos = src.find(target);   //找到'.'的位置     if( startpos != std::string::npos ) //std::string::npos表示没有找到该字符     {      src.replace(startpos,1,replacement); //实施替换,注意后面一定要用""引起来,表示字符串     }   } 

 return true; }

//提取路径中的文件名字(带路径,不带扩展名) //substr字符串中,第一个参数为截取的位置,第二个为截取的长度 std::string StringGetFullFileName(std::string path) {  return path.substr(0, path.rfind('.') == std::string::npos ? path.length() : path.rfind('.') ); }

//提取路径中的文件名字 std::string StringGetFileName(std::string path) {  StringReplace(path, "/", "\\");  std::string::size_type startpos = path.rfind('\\') == std::string::npos ? path.length() : path.rfind('\\')+1;  std::string::size_type endpos   = path.rfind('.') == std::string::npos ? path.length() : path.rfind('.');

 return path.substr(startpos, endpos-startpos); }

//提取路径中文件名字(带扩展名) std::string StringGetFileNameWithExt(std::string path) {  StringReplace(path, "/", "\\");  std::string::size_type startpos = path.rfind('\\') == std::string::npos ? path.length() : path.rfind('\\')+1;  return path.substr(startpos); }

//提取路径中的文件路径 std::string StringGetDirectory(std::string path) {  StringReplace(path, "/", "\\");  return path.substr(0, path.rfind('\\') == std::string::npos ? path.length() : path.rfind('\\') ); }

//提取路径中的文件类型 std::string StringGetFileExt(std::string path) {  StringReplace(path, "/", "\\");  return path.substr(path.rfind('.') == std::string::npos ? path.length() : path.rfind('.')+1 ); }

#ifdef _cplusplus } #endif

#endif

### 三级标题:使用 `std::string` 按指定子字符串进行分割 在 C++ 中,`std::string` 没有内置的 `split` 方法来分割字符串,但可以通过结合 `std::istringstream` 和 `std::getline` 实现字符串分割功能。这种方式适用于按单个字符作为分隔符的场景,但若需要按指定子字符串进行分割,则需要自定义实现。 以下是一个按指定子字符串进行分割的实现方式: ```cpp #include <iostream> #include <string> #include <vector> std::vector<std::string> split(const std::string& str, const std::string& delimiter) { std::vector<std::string> tokens; size_t start = 0; size_t end = str.find(delimiter); while (end != std::string::npos) { tokens.push_back(str.substr(start, end - start)); start = end + delimiter.length(); end = str.find(delimiter, start); } tokens.push_back(str.substr(start)); return tokens; } int main() { std::string str = "abc,123,def"; std::string delimiter = ","; std::vector<std::string> tokens = split(str, delimiter); // tokens 现在为 {"abc", "123", "def"} return 0; } ``` 该实现利用了 `std::string::find` 来查找分隔符的位置,并通过 `std::string::substr` 提取子字符串。若未找到分隔符,则将剩余部分作为最后一个子字符串添加到结果中[^3]。 对于性能要求较高的场景,可以考虑使用更高效的字符串匹配算法(如 KMP 算法)来优化查找过程,以减少重复计算。此外,若需处理只读字符串或避免额外内存分配,可结合 `std::string_view` 提升效率,因为其不拥有字符串数据,仅作为已有字符串数据的引用[^2]。 ### 三级标题:相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值