我想作一个接口来处理字符串分离的问题,比如输入wo3shi4zhong1guo2ren2现在需要把拼音串和声调分离开,再把声母和韵母分离开,最后给声韵母和声调分配人发音时的时长,比如说s是232ms,i是176ms,诸如此类给分离后的声韵母和声调一一对应起来,具体各个时长可以假设一下,我只要知道方法就行了,假如用单文档来做,用CEditView为基类,在客户区输入上述,我要怎么处理?? 
急!望高手指点!望哪位高人师傅可以给一下源代码演示,不胜感激!仅以100分作为回报! 
谢谢。

解决方案 »

  1.   

    /*******************************************************************************
     特别说明:本程序由王老师于2000年编写
    *******************************************************************************/
    #ifndef _CParseString_H_
    #define _CParseString_H_//字符串解析
    class CParseString:public CObject
    {
    private:
    int pos,len;
    public:
    CString string,separator;
    public:
    void SetString(CString str,CString sep=_T(" ,\t"));
    void GetData(CString &s);
    bool GetData(double &f);
    bool GetData(int &n);
    bool GetData(char &ch);
    };#endif //_CParseString_H_
    //实现
    #include "stdafx.h"
    #include "parsestring.h"void CParseString::SetString(CString str,CString sep)
    {
    string=str;
    separator=  sep;
    pos=0;
    }
    void CParseString::GetData(CString &s)
    {
    string.TrimLeft(' ');
    string.TrimLeft(',');
    string.TrimLeft('\t');
    pos=string.FindOneOf(separator);
    if(pos>=0) s=string.Left(pos);
    else s=string;
    string.Delete(0,s.GetLength());
    }
    bool CParseString::GetData(double &f)
    {
    CString ss;
    string.TrimLeft(' ');
    string.TrimLeft(',');
    string.TrimLeft('\t');
    pos=string.FindOneOf(separator);
    if(pos>=0) ss=string.Left(pos);
    else ss=string;
    string.Delete(0,ss.GetLength());
    if(ss.IsEmpty()) return false;
    f=atof(ss);
    return true;
    }
    bool CParseString::GetData(int &n)
    {
    CString ss;
    string.TrimLeft(' ');
    string.TrimLeft(',');
    string.TrimLeft('\t');
    pos=string.FindOneOf(separator);
    if(pos>=0) ss=string.Left(pos);
    else ss=string;
    string.Delete(0,ss.GetLength());
    if(ss.IsEmpty()) return false;
    n=atoi(ss);
    return true;
    }
    bool CParseString::GetData(char &ch)
    {
    CString ss;
    string.TrimLeft(' ');
    string.TrimLeft(',');
    string.TrimLeft('\t');
    pos=string.FindOneOf(separator);
    if(pos>=0) ss=string.Left(pos);
    else ss=string;
    string.Delete(0,ss.GetLength());
    if(ss.IsEmpty()) return false;
    ch=ss[0];
    return true;
    }这里你可以定义分割字符为“1234”
      

  2.   

    呵呵,在wo3shi4zhong1guo2ren2里,声调是数字,很好FIND出来吧(用CString.find()),它前面就是拼音.然后呢,我们知道所有的声母(小学里的声母表),把它摘出来,剩下的就是韵母了.呵呵,关于时间嘛,简单了吧.
      

  3.   

    #define SYLL_DELIM  " 0123456789"
    #define TONE_DELIM  " abcdefghijklmnopqrstuvwxyz:;,.?!:;,。?!ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    void SyllableToneSeparation(char *PINGYIN){
    char    chunk[128],syllable[64][10];
    char    *buf;
    char    *tok;
    int i,j,tone[64];
    /* seperate syllables from each chunk */
    strcpy(chunk,PINGYIN);
    for(j = 0, buf = chunk, tok = strtok(buf,SYLL_DELIM); tok; tok = strtok(0,SYLL_DELIM), j++){
    strcpy(syllable[j],tok);
    } /* seperate tones from the chunk */
    strcpy(chunk,PINGYIN);
    for(j = 0, buf = chunk, tok = strtok(buf,TONE_DELIM); tok; tok = strtok(0,TONE_DELIM), j++){
    tone[j] = atoi(tok);
    }
    }
    这是分离拼音串和声调的函数,下面的就不会了。谁给接着写完?想想分离声韵母还用这种形式不太好了,请高人指点!
      

  4.   

    一段测试程序,可利用上面的CParseString类讲拼音串和声调分离void CSpell_tuneView::OnSplit() 
    {
    CParseString cp;

    CString str,sep;
    CStringArray spellA,sTuneA;
    CUIntArray   tuneA;
    // str="wo3shi4zhong1guo2ren2";
    GetSelectedText(str);
    sep="1234";
    while(!str.IsEmpty()){
    CString sTemp;
    cp.SetString(str,sep);
    cp.GetData(sTemp);
    spellA.Add(sTemp); UINT nTemp;
    str=cp.string;
    sTemp=str.Left(1);
    nTemp=atoi(sTemp);
    str.Delete(0);
    tuneA.Add(nTemp);
    sTuneA.Add(sTemp);
    } CClientDC dc(this);
    int x=200,y=200;
    dc.TextOut(x,y,"拼写      声调");
    for(int i=0;i<spellA.GetSize();i++){
    y+=20;
    CString sText=spellA[i];
    sText+="      ";
    sText+=sTuneA[i];
    dc.TextOut(x,y,sText);
    }
    }我觉得分离声母和韵母利用这个办法也完全可以分开,只不过麻烦一些
      

  5.   

    Thanks!大家说的好象都是如何分离拼音串和声调的东西,小弟愚钝,但认为我的分离拼音串和声调的函数还是可行的。那么声韵母分离呢?如何进行时长分配呢?还请指点一二,?能给出一个完整的代码吗?:)
      

  6.   

    ----------------  关于编写字符处理代码的合同   -----------------甲方: 楼主
    乙方: Saimen
    甲方提出编写代码要求:
        输入   wo3shi4zhong1guo2ren2
        
        现在需要
        1。把拼音串和声调分离开,
        2。再把声母和韵母分离开,
        3。最后给声韵母和声调分配人发音时的时长,    例如:s是232ms,i是176ms,诸如此类
             给分离后的声韵母和声调一一对应起来入口参数要求:
    输出要求:
    其它要求:
    乙方完成后,甲方给乙方200分,(估计你也加不了200分,最少100)为防止完成代码功能上的纠纷,请甲方更详细描述要求