免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1598 | 回复: 4
打印 上一主题 下一主题

[算法] [算法交流]-实用算法(在半/全角字串中取小于最大长度的完整全角字或半角字符) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-02-09 18:10 |只看该作者
怎么没有人回应呢?

论坛徽章:
0
3 [报告]
发表于 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 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-02-09 18:44 |只看该作者
好!先研究

论坛徽章:
0
5 [报告]
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP