強大穩定的字符串分割 C++ 類:StringSpliter

jopen 10年前發布 | 25K 次閱讀 C/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.baiduhome.net/lib/view/home/1404896001497

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!