程序使用对话框界面功能要求:用户可以输入任意长度的字符串,编写一个函数(见函数功能),通过调用该函数得到结果,并显示出来。函数功能:将源字符串中的所有数字取出来,每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请高手们帮帮忙,把具体代码贴出来了,最好有一些注释搞定之后在加分

解决方案 »

  1.   

    相同的数字舍弃没写,你自己添加,也很简单。//不考虑效率
    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;
      

  2.   

    可以给你些提示:
    1、因为3位数字最多有1000种排列方式,你可以分配一个长度为4000的字符串用来储存结果,另外定义一个长度为1000的BOOL型数组来记录每种排列是否前面已经出现。(按照节省内存空间的原则应该用位表示,不过如果不在意内存用量,用BOOL比较容易)
    2、定义一个小缓冲区,用循环每次读入一个字符,如果不是数字则直接抛弃,是数字则存入缓冲区,达到3个后转换为数值,以该值为下标判断BOOL型数组中对应的元素,如果为TRUE,则跳过其它操作重新开始读取字符,如果是FALSE,则修改为TRUE,并将小缓冲区中的字符复制到结果缓冲区中(加上逗号),然后重新开始读取字符,直到用户输入Enter为止(最后去掉多余的逗号)。
      

  3.   

    白天没鸟事,晚上鸟没事。闲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;