使用连续分隔符和空最后一个字符进行拆分

Split with consecutive delimiters AND empty last character

本文关键字:字符 拆分 最后一个 连续 分隔符      更新时间:2023-10-16

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

我需要什么:

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

Cadena 是一个使使用字符更容易的类。

例如:


例1(

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

应添加到列表 (1,乔希,斯科特,@EMPTY@,1995,@EMPTY@(

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


例2(

1:迈克::

应添加到列表 (1,迈克,@EMPTY@,@EMPTY@(

我当前的函数给了我这个输出:(1,迈克,@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@