用连续的定界符分割,最后一个字符为空

Split with consecutive delimiters AND empty last character

我目前正在努力使这个拆分功能正常工作。

我需要的:

该函数必须将包含定界符 (:) 的字符串拆分为一个列表(称为 ListaPos)。

Cadena class 可以更轻松地处理字符。

例如:


示例 1)

1:乔希:斯科特::1995:

应该添加到列表中 (1,Josh,Scott,@EMPTY@,1995,@EMPTY@)

我当前的函数给出了这个输出:(1,Josh,Scott,@EMPTY@,1995)


示例 2)

1:迈克::

应该添加到列表中(1,Mike,@EMPTY@,@EMPTY@)

我当前的函数给出了这个输出:(1,Mike,@EMPTY@)

以下是目前正在使用的功能:

char* strtok_single(char* str, char const* delims)
{
    static char* src = NULL;
    char* p, * ret = 0;

    if (str != NULL)
        src = str;

    if (src == NULL)
        return NULL;

    if ((p = strpbrk(src, delims)) != NULL) {
        *p = 0;
        ret = src;
        src = ++p;

    }
    else if (*src) {
        ret = src;
        src = NULL;
    }

    return ret;
}

ListaPos<Cadena>* Cadena::Split(Cadena& str, const char* delimitador) const {
    Cadena empty = Cadena("@EMPTY@", true);
    ListaPos<Cadena>* ret = new ListaPosImp<Cadena>();
    char* p = strtok_single(str.GetNewCharPtr(), delimitador);

    while (p) {
        Cadena nueva = Cadena(p, true);
        if (nueva == empty)
        {
            cout << "ERROR: No se puede agregar la tupla, no se puede insertar el dato @EMPTY@.";
            delete ret;
            return NULL;
        }
        if (*p)  ret->AgregarFin(p);
        else     ret->AgregarFin("@EMPTY@");
        p = strtok_single(NULL, delimitador);
    }
    return ret;

}

如果你能帮助我实现我的目标,我将不胜感激。

谢谢大家

很难理解函数 Split 的作用。然而函数strtok_single在这部分有逻辑错误

else if (*src) {
    ret = src;
    src = NULL;
}

应该有

else 
{
    ret = src;
    src = NULL;
}

这里是一个C演示程序(用于演示使用标准C函数strpbrk不需要使用C++程序)

#include <stdio.h>
#include <string.h>

char* strtok_single(char* str, char const* delims)
{
    static char* src = NULL;
    char* p, * ret = 0;

    if (str != NULL)
        src = str;

    if (src == NULL)
        return NULL;

    if ((p = strpbrk(src, delims)) != NULL) {
        *p = 0;
        ret = src;
        src = ++p;

    }
    else 
    {
        ret = src;
        src = NULL;
    }

    return ret;
}

int main(void) 
{
    char s[] = "1:Josh:Scott::1995:";
    const char *delim = ":";

    for ( char *p = strtok_single( s, delim ); 
          p != NULL; 
          p = strtok_single( NULL, delim ) )
    {
        if ( *p ) puts( p );
        else puts( "@EMPTY@" );
    }         

    return 0;
}

程序输出为

1
Josh
Scott
@EMPTY@
1995
@EMPTY@