2009年4月7日 星期二

知識+ 拆解字串Class


// ===================================================================
// 20090328 知識 +
// http://tw.knowledge.yahoo.com/question/question?qid=1509032810921
// 發問者 : http://tw.knowledge.yahoo.com/my/my?show=AF03295403
// ===================================================================

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

class SplitString
{
private:
char *m_String;
char *m_Split;
int *m_Index;
int m_Count;
int m_len;

public:
SplitString(const char *inString,const char *inSplit)
{
m_String=NULL;
m_Split=NULL;
m_Index=NULL;
m_Count=0;
m_len=0;
SetString(inString);
SetSplit(inSplit);
}

~SplitString()
{
if(m_String!=NULL)
delete [] m_String;
if(m_Split!=NULL)
delete [] m_Split;
if(m_Index!=NULL)
delete [] m_Index;
}

void SetString(const char *inString)
{
if(m_String!=NULL)
delete [] m_String;
m_len = (int)strlen(inString)+1;
m_String = new char[m_len*2];
strcpy(m_String, inString);
SetSplit(m_Split);
}

bool SetSplit(const char *inSplit)
{
if(m_String==NULL || m_len==0 )
return false;
char * string2 = &m_String[m_len];
strcpy(string2, m_String);

m_Count = 0;
if (m_Index!=NULL)
delete [] m_Index;
if(inSplit==NULL)
{
if(m_Split!=NULL)
delete [] m_Split;
m_Split = NULL;
return true;
}
int len = strlen(inSplit)+1;
if(m_Split != inSplit)
{
if(m_Split!=NULL)
delete [] m_Split;
m_Split = new char[len];
strcpy(m_Split, inSplit);
}

for(int i=m_len-2; i>=0; i--)
{
for(int j=len-2; j>=0; j--)
if(string2[i]==m_Split[j])
{
string2[i]='\0';
break;
}
}
m_Index = new int[m_len];
for(int i=0;i<m_len-1; i++)
{
if(string2[i]=='\0') continue;
m_Index[m_Count++] = i;
while(string2[++i]!='\0');
}
m_Index[m_Count]=m_len-1;
return true;
}

const char * GetSplitString(int index)
{
if(index<0 || m_String==NULL || m_len==0 )
return m_String;
char * string2 = &m_String[m_len];
if(index>m_Count)
index = m_Count;
return (&string2[m_Index[index]]);
}

int Count(void)
{
if(m_String==NULL || m_len==0 )
return 0;
return m_Count;
}
};

int main()
{
SplitString str("123,456,789,AAA",",");
int count = str.Count();
printf("\nCount = %d; string=\"%s\"\n", count, str.GetSplitString(-1));
for(int i=0; i<=count; i++)
printf("\nSplit[%d] : %s", i, str.GetSplitString(i));

str.SetString("A \"contributor\" is any person that distributes its contribution under this license.");
str.SetSplit(" .\"");
count = str.Count();
printf("\n\nCount = %d; string=\"%s\"\n", count, str.GetSplitString(-1));
for(int i=0; i<=count; i++)
printf("\nSplit[%d] : %s", i, str.GetSplitString(i));
return 0;
}

沒有留言:

張貼留言