100分奉献,完了在加 请大家帮忙做一道题(急!!!!)

zl5489 2008-04-04 03:57:55

程序使用对话框界面

功能要求:用户可以输入任意长度的字符串,编写一个函数(见函数功能),通过调用该函数得到结果,并显示出来。

函数功能:将源字符串中的所有数字取出来,每3个数字为1组,组间增加一个逗号,最后不满3个数字的舍弃,相同的组只保留第一个,这样组成一个新的目标字符串。注意:目标字符串和源字符串不能使用同一空间,请不要使用CString和string,而只允许使用char, char*,LPCSTR, LPSTR等类型

例:用户输入:123d的ff34df0532-34jh00,34,99908 结果:123,340,532,034,999 说明:其中两个340,只保留第一个 340,最后的08,不满三个数字,舍弃了。

请务必使用VC++ 6.0

请高手们帮帮忙,把具体代码贴出来了,最好有一些注释

搞定之后在加分
...全文
72 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
andywiliang 2008-04-05
帮顶



请高手坐阵本群管理员
C C++ C# JAVA编程交流群:11713348
回复
yxz_lp 2008-04-05
白天没鸟事,晚上鸟没事。闲

BOOL chek(char* sour,CPtrArray* chararray)
{
BOOL re=TRUE;
int count=chararray->GetCount();
if (!count)
{
return TRUE;
}
for (int i=0;i<count;i++)
{
char* temp=(char*)chararray->GetAt(i);
int test=strcmp(sour,temp);
if(test==0)
{
re=FALSE;
break;
}
}
return re;
}
////////////////////
ULONG distilchar(LPCSTR sour, LPSTR* ppDest)
{
ULONG slen,jishu=0;
slen=strlen(sour);

char* temp1=new char[4];
CPtrArray chararray;
for (int i=0;i<slen;i++)
{
if (sour[i]<0)
continue;
if(isdigit((int)sour[i]))
{

temp1[jishu]=sour[i];
jishu++;
if (jishu==3)
{
jishu=0;
temp1[3]='\0';
if(chek(temp1,&chararray))
{
char* temp2=new char[4];
strcpy(temp2,temp1);
chararray.Add(temp2);

}

}

}
}

int count=chararray.GetCount();
if (count==0)
{
return 0;
}
char* temp=new char[count*3+count];
strcpy(temp,(char*)(chararray.GetAt(0)));
for (int i=1;i<count;i++)
{
strcat(temp,",");
char* charat=(char*)(chararray.GetAt(i));
strcat(temp,charat);

}
for (int i=0;i<count;i++)
{
char* charat=(char*)(chararray.GetAt(0));
chararray.RemoveAt(0);
delete charat;
}

delete [] temp1;
*ppDest=temp;
return count;
}
/////////////////////
//调用代码
char* test="123d的ff34df0532-34jh00,34,999858uugygu65545yniu6y8rgh0456y9tgj904jer687jhb[wrtk--965w3w90-945650945";
LPSTR dest;
distilchar(test,&dest);
delete dest;
回复
hyblusea 2008-04-04
支持1,4楼..楼主你可以自己试着先做..遇到问题再发贴问
回复
cnzdgs 2008-04-04
可以给你些提示:
1、因为3位数字最多有1000种排列方式,你可以分配一个长度为4000的字符串用来储存结果,另外定义一个长度为1000的BOOL型数组来记录每种排列是否前面已经出现。(按照节省内存空间的原则应该用位表示,不过如果不在意内存用量,用BOOL比较容易)
2、定义一个小缓冲区,用循环每次读入一个字符,如果不是数字则直接抛弃,是数字则存入缓冲区,达到3个后转换为数值,以该值为下标判断BOOL型数组中对应的元素,如果为TRUE,则跳过其它操作重新开始读取字符,如果是FALSE,则修改为TRUE,并将小缓冲区中的字符复制到结果缓冲区中(加上逗号),然后重新开始读取字符,直到用户输入Enter为止(最后去掉多余的逗号)。
回复
scq2099yt 2008-04-04
mid,left,right,find
回复
yxz_lp 2008-04-04
相同的数字舍弃没写,你自己添加,也很简单。

//不考虑效率
ULONG analchar(LPCSTR sour, LPSTR* ppDest)
{
ULONG slen,dlen=0,tag=0;
slen=strlen(sour);
char* temp=new char[slen];
CPtrArray chararrar;//用来储存分割开来的字符串
for (int i=0;i<slen;i++)
{
if (sour[i]<0)
continue;
if(isdigit((int)sour[i]))
{

temp[dlen]=sour[i];
dlen++;tag++;
if (!(tag%3))
{
//在这里加上相同的数字判断代码,相同就删除
temp[dlen++]=',';
}
}
}
int lastcount=tag%3;
if (lastcount)
{
temp[dlen-lastcount-1]='\0';
}

temp[dlen-1]='\0';

*ppDest=temp;
return dlen-2;
}
//调用代码
char* test="123d的ff34df0532-34jh00,34,99980";
LPSTR dest;
analchar(test,&dest);
delete dest;
回复
......
自己写吧,你那里不会?
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-04 03:57
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……