Chinaunix

标题: [算法交流]-实用算法(在半/全角字串中取小于最大长度的完整全角字或半角字符) [打印本页]

作者: ChinaDream    时间: 2006-01-14 16:47
标题: [算法交流]-实用算法(在半/全角字串中取小于最大长度的完整全角字或半角字符)
例如:
“我在正在TEST my application请稍候 ”

取27个字符=“我在正在TEST my application”
取28个字符=“我在正在TEST my application”
取29个字符=“我在正在TEST my application请”

我写的如下,欢迎大家提供好的算法!
BOOL IsChineseChar(const char Char)
{
        if(Char & 0x80)
        {
                return (TRUE);
        }
        else
        {
                return (FALSE);
        }
}

int ChineseCharLimit(char *pszBuffer,int iMaxLenth)
{
        int                i                        ={0};
        char        *pszSrc                ={0};
        char        *pszChr                ={0};

        pszSrc = (char *)pszBuffer;
        pszChr = NULL;

        for(i=0;i<iMaxLenth;i++)
        {
                if(pszSrc==0)
                {
                        return (0);
                }
                else if(IsChineseChar(pszSrc))
                {
                        pszChr = &pszSrc;
                        i++;
                }
        }

        if((pszChr == NULL) || ((int)((&pszChr[1]) - pszBuffer) < iMaxLenth))
        {
                pszBuffer[iMaxLenth]=0;
                return (1);
        }
        else
        {
                pszChr[0]=0;
                pszChr[1]=0;
                return (2);
        }
}

void main()
{
        szTmp[128];
        strcpy( szTmp,"我在正在TEST my application请稍候" );
        ChineseCharLimit( szTmp,27 );
        printf( "取27个字符=%s",szTmp );

        strcpy(szTmp,"我在正在TEST my application请稍候" );
        ChineseCharLimit( szTmp,28 );
        printf("取28个字符=%s",szTmp);

        strcpy( szTmp,"我在正在TEST my application请稍候" );
        ChineseCharLimit( szTmp,29 );
        printf( "取29个字符=%s",szTmp );

}

[ 本帖最后由 ChinaDream 于 2006-1-14 16:50 编辑 ]
作者: ChinaDream    时间: 2006-02-09 18:10
怎么没有人回应呢?
作者: doni    时间: 2006-02-09 18:35
这个我也写过的,以前好象也发过贴子
  1. char *cut_chinese(chinese, length)
  2. char chinese[100];
  3. int  length;
  4. {
  5.   static char string[100];

  6.   strcpy(string, chinese);
  7.   if (strlen(string) > length){
  8.      int i=0;
  9.      while (i < length) {
  10.         if (isascii(string[i]) == 0)
  11.            i++;
  12.         i++;
  13.         }

  14.      if (i > length)  /* string[length] is hi byte */
  15.         string[length-1]='\0';
  16.      else             /* string[length] is low byte */
  17.         string[length] = '\0';
  18.   }

  19.   return((char *)string);
  20. }
复制代码

[ 本帖最后由 doni 于 2006-2-9 18:37 编辑 ]
作者: ChinaDream    时间: 2006-02-09 18:44
好!先研究
作者: yzc2002    时间: 2006-02-10 08:57
这只是一个简单的编程题,组织好思路就可以了,算法还谈不上吧?
  1. int chn_strcpy(char *dest, char *string, int n)
  2. {
  3.     int len, flag=0;
  4.     for(len=0; string[len] && len < n; len++)
  5.         if(string[len] & 0x80) flag = !flag;
  6.     len -= flag;
  7.     memcpy(dest, string, len);
  8.     dest[len] = 0;
  9.     return len;
  10. }
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2