用连续的定界符分割,最后一个字符为空
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@
我目前正在努力使这个拆分功能正常工作。
我需要的:
该函数必须将包含定界符 (:) 的字符串拆分为一个列表(称为 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@