强大稳定的字符串分割 C++ 类:StringSpliter

分享到:

一个强大稳定的字符串分割 C++ 类,是对 c_tokenizer 的封装。

string_spliter.h

/* string_spliter.h */
#pragma once
#ifndef STRING_SPLITER_H
#define STRING_SPLITER_H
class StringSpliter {
public:
enum {EMPTIES_OK = 0, NO_EMPTIES};
public:
StringSpliter(const char* str, const char* delimiters, int empties = StringSpliter::EMPTIES_OK);
~StringSpliter();
const char* Next();
private:
char*
m_string;
const char* m_delimiters;
char*
m_current;
char*
m_next;
bool
m_is_ignore_empties;
};
#endif
string_spliter.cpp
/* string_spliter.cpp */
#include <string>
#include "string_spliter.h"
StringSpliter::StringSpliter(const char* str, const char* delimiters, int empties)
{
if (str && delimiters) {
size_t n = strlen(str) + 1;
char  *p = (char*)malloc(n);
if (p) {
this->m_string = (char*)memcpy(p, str, n);
} else {
this->m_string = NULL;
}
} else {
this->m_string = NULL;
}
this->m_delimiters
= delimiters;
this->m_current
= NULL;
this->m_next
= this->m_string;
this->m_is_ignore_empties = (empties != StringSpliter::EMPTIES_OK);
}
StringSpliter::~StringSpliter()
{
free(this->m_string);
this->m_string = NULL;
}
const char* StringSpliter::Next()
{
if (!this->m_string || !this->m_next) {
return NULL;
}
this->m_current = this->m_next;
this->m_next = strpbrk(this->m_current, this->m_delimiters);
if (this->m_next) {
*(this->m_next) = '\0';
this->m_next += 1;
if (this->m_is_ignore_empties) {
this->m_next += strspn(this->m_next, this->m_delimiters);
if (!(*(this->m_current))) {
return this->Next();
}
}
} else if (this->m_is_ignore_empties && !(*(this->m_current))) {
return NULL;
}
return this->m_current;
}

用法:

char *str = "$PTNL,PJK,102823.80,012613,+3541087.713,N,+1878282.023,E,1,16,0.8,EHT+52.668,M*4F";
StringSpliter string_spliter(str, ",");
int n;
const char *sec;
for (n=0, sec = string_spliter.Next(); sec; sec=string_spliter.Next(), n++) {
printf("%2d: %s\n", n, sec);
}

项目主页:http://www.open-open.com/lib/view/home/1404896001497

昵    称:
验证码:

相关文档:

  • Node.js的C++移植版本 Node.native
    node.native 是 node.js 的一个 C++11 (aka C++0x) 的一个移植。...
  • Platinum UPnP SDK
    Platinum UPnP SDK 是一个跨平台的C++库,利用该库,你可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/UPnP Device),其...
  • C++界面库:DuiVision
    一个c++界面库. DuiVision界面库是参考了仿PC管家程序、金山界面库、DuiEngine、DuiLib等多个基于DirectUI的界面库开发的。...
  • C++的Properties读写库 libproperties
    提供一个简单易用的C++类Properties用以读写基于xml格式的配置文件。...
  • MySQL Connector/C++接口实例
    mysql的官方网站有对MySQL Connector/C++的文档解释和具体实例,但是大家也知道,如果把那些具体实例的代码只是生硬的套入项目工程中是万...
  • C++多核编程框架 Threading Building Blocks (TBB)
    在多核的平台上开发并行化的程序,必须合理地利用系统的资源 - 如与内核数目相匹配的线程,内存的合理访问次序,最大化重用缓存。...
  • fql - 采用类似SQL的方式操作文件
    fql是一个工具可以让你采用类似于SQL查询的方式来操作文件....
  • C语言实现gsoap输出数据类型到XML的方法
    C语言实现gsoap输出数据类型到XML的方法...
  • C++模板库 Standard Portable Library
    Standard Portable Library 是一个指针友好的 C/C++ 标准模板库的替代产品,它所提供的 API 跟 Java 或者是 .NET 的语言类似,包括公用的数据结构...
  • C++系统调用库 CSCall++
    CSCall++ 是对常用的一些系统调用进行封装的 C++ 库,主要包括:线程、文件、FIFOs、串行IO、socket通讯和目录处理等。...
  • boost有用的库信息
    boost是一系列C++模板库组成的免费,可移植,开源的程序库.网络上关于boost的文章已经很多....
  • C++ 解析器线程的传播库:libpondyparser
    libpondyparser 是另一个使用 Markov 模型的多核 C++ 解析器线程的传播库,包含了一个使用增强学习传播的线程来打包一个指向统计解析库的...
  • C语言哈希表 uthash
    uthash 是一个C语言的哈希表,支持各种结构类型的存储、添加、删除,这些操作都在固定的时间完成,跟哈希表本身的大小无关。键也可...
  • 单位转换测量 GNU Units
    GNU 单位转换测量到其等值的其他测量系统的各种系统中表达量。像许多类似的方案,它可以处理乘法规模的变化。...
  • C++图像处理库 ImageStone
    ImageStone是一套功能强大的C++图像处理库,它可以在多个平台之间移植。...
  • C++ 转换成 JSON
    经常有朋友问我如何将C++对象转换成JSON格式字符串。我的回答通常是CppCMS中的json::value. 我也写过一篇文章介绍该技术。...
  • C++ 标准类库 STLPort
    STLport 是一个多平台的 ANSI C++ 标准类库实现,具备很多高级特征,并且为效率,异常安全性和线程安全性做了优化,还做了许多扩展,如...
  • c++中string用法汇总
    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且...
  • 基于Accelerate框架的 API:Surge
    Surge是一个基于Accelerate框架和C语言开发,用于进行矩阵运算、数学信号处理和图像处理的API。换句话说,就是可以非常快速的处理数学...
  • 用C++简单封装了一下SQLite
    SQLite 强大,大家都知道,但是原生是C接口,用来其应用层稍微麻烦些。 今天做了个简单的C++封装,使用面向对象的方法来使用。...