请各位帮我看看做一个字符串相关的函数!分数多多!谢谢!!!

sintenb 2002-07-30 09:40:48
请各位大虾帮我看看,我想实现这种结果,请帮我做个函数?
我想了好久,实在是做不出来了:(,请帮帮我吧,谢谢!

我现有一个CString的数组
CString A[2];
A[0] = "ABC";
A[1] = "XYZ";
然后还有一个CString
CString Str = "12ABC345XYZ67890";

我想把Str里所有A数组里的有的字符串进行分割然后放到一个新的数组里,比如这里的Str分割后就会得到这个

MyData[5],被分割为5份:"12"、"ABC"、"345"、"XYZ"、"67890",就是碰到A数组里有的就拆开。

MyData[0] 的值为 "12"
MyData[1] 的值为 "ABC"
MyData[2] 的值为 "345"
MyData[3] 的值为 "XYZ"
MyData[4] 的值为 "67890"

谢谢!! 重分相送,在线等待,如果解决,立即加分,不够再加!说到做到!
oicq:104140055
...全文
8 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sintenb 2002-07-31
不会的
回复
punpuny 2002-07-31
当然如果你的A数组中的元素有相互包含的复杂情况,需要另外编程。
比如
A[0] = "ABCD";
A[1] = "BC"
回复
punpuny 2002-07-31
const int nDim = 4;

CString str = "12ABC345XYZ67890abcdefadsfla";
CString A[nDim];
CList<CString, CString> list;
int start = 0, nLen = str.GetLength(), index;
int temppos = 0, pos = 0;

A[0] = "XYZ";
A[1] = "ABC";
A[2] = "sf";
A[3] = "bcd";

do
{
temppos = 0;
index = 0;
pos = nLen -1;

// Find the minimize split position
for (int i = 0; i < nDim; i++)
{
temppos = str.Find(A[i], start);

// The current split position is less than pos, record the current position
if (temppos < pos && temppos > -1)
{
pos = temppos;
index = i;
}
}

if (pos != nLen -1)
{
list.AddTail(str.Mid(start, pos - start));
list.AddTail(A[index]);
start = pos + A[index].GetLength();
}
else
{
list.AddTail(str.Right(nLen - start));
}
} while (start < nLen && pos != nLen -1);

我帮你试了一下上面的代码,应该没问题。思想首先从第一个字符起,遍历A数组,找出在str中最左边的分割位置,然后进行分割,分割完后,第一个字符不会再含有A数组中的任何字符,所以插入链表中,而第二个字符是分割字符,所以也插入链表,然后对第三个字符,再重复以上的操作,直到剩下的字符串中不再包含A数组中的任何元素为止。这样所有的分割完成。
回复
sintenb 2002-07-31
谢谢dy_paradise

你能帮我写全点吗,我没太看懂,不知道该怎么改……谢谢你
回复
dy_paradise 2002-07-31
如果你A[]中的值很多,你只要在没个循环中都加上类似上面的语句就OK了~~
回复
dy_paradise 2002-07-31
我再说明一下吧,你在串中找到A[0]后,你必须查看该位置前面是否含有A[1],直到把所有的A[1]都找到,并存到目的数组。
回复
dy_paradise 2002-07-31
我只写出了一个循环,下一个同理,你自己完成吧:

int MyData_Num = 0;
CString tmpString;
int temp1 = Str.Find(A[0]);
//int temp2 = Str.Find(A[1]);
while (temp1!=-1)
{
tmpString = Str.Left(temp1);
temp2 = tmpString.Find(A[1]); // 判断该串中是否有 A[1]
if (temp2==-1)
{
MyData[MyData_Num] = Str.Left(temp1);
MyData_Num++;
Str = Str.Right(Str.GetLength()-temp1);
MyData[MyData_Num] = A[0];
MyData_Num++;
Str = Str.Right(Str.GetLength()-A[0].GetLength());
}
else
{
while (temp2!=-1)
{
MyData[MyData_Num] = tmpString.Left(temp2);
MyData_Num++;
tmpString = tmpString.Right(tmpString.GetLength()-temp2);
MyData[MyData_Num] = A[1];
MyData_Num++;
tmpString = tmpString.Right(tmpString.GetLength()-A[1].GetLength());
temp2 = tmpString.Find(A[1]);
}
if (tmpString.GetLength()!=0)
{
MyData[MyData_Num] = tmpString;
MyData_Num++;
}
}
temp1 = Str.Find(A[0]);
}
回复
sinten 2002-07-31
谢谢rokia
这样呀,我A[]现在是有2个值,但是我用的时候可能会多, 这样做可能……
回复
punpuny 2002-07-31
不好意思,我不能用qq的,我用了大概半个小时吧。比较愚蠢:)
回复
peterguan 2002-07-31
to punpuny
你用了多长时间?
回复
sintenb 2002-07-31
punpuny() 能留个qq号吗, 交个朋友:)
回复
sintenb 2002-07-31
谢谢punpuny() !!!

给分啦!!
回复
punpuny 2002-07-31
什么是算出来的?能给个例子吗? :)
回复
sintenb 2002-07-31
上句说错了,就当我没说过:P
回复
sintenb 2002-07-31
to punpuny
nDim 不是已知道的

是算出来的,怎么办:(
回复
rokia 2002-07-30
不好意思,給你一段代碼,寫的很臭,效率也不高。如果你要求不高的話還可以用:

while(Str.GetLength()>0)
{
int a=Str.Find(A[0]);
int b=Str.Find(A[1]);

if(a==-1 && b==-1)
{
MessageBox(Str);
Str="";
}
else if((a==-1)||(b<a))
{
if(b==0)
b=A[1].GetLength();
tmp=Str.Left(b);
Str=Str.Right(Str.GetLength()-b);
MessageBox(tmp);
}
else if((b==-1)||(a<b))
{
if (a==0)
a=A[0].GetLength();
tmp=Str.Left(a);
Str=Str.Right(Str.GetLength()-a);
MessageBox(tmp);
}
}
回复
mooncat2000 2002-07-30
相当与全文检索,遇到首字在A[]中有的,入栈继续看下一个字符,一旦错了就弹空,如果找到指定串保存出来,并把前面的一段也保存出来就可以了

回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告