首页
社区
课程
招聘
看编程区比较冷清,小弟不才想搞个比赛,有兴趣的进来试试吧!
发表于: 2009-4-20 17:17 12087

看编程区比较冷清,小弟不才想搞个比赛,有兴趣的进来试试吧!

2009-4-20 17:17
12087

最近这段时间因工作关系一直在搞 C 语言,接触时间久了,越来越感觉,C语言真是强大!
除了汇编没有任何语言可与其匹敌,是高级语言中的王者.
      这几天研究各种编码之间的转换,查了不少的资料,刚刚写了一个取中英文长度的的函数,
写着写着,就想把函数做到最简洁最高效,于是就想拿到论坛上来和大家一起学习学习,以下是我认为我能写出来的最简洁的了,看大家有没有办法在精简!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (36)
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
=====================================
int ustrlen(unsigned char data[]) // 注:只精简此函数,只能用C语言.
{
  int i = 0, count = 0;

  for(;data[i];(data[i++] & 0xFF) > 127 ? ++i:i, ++count);

  return count;
}
人家*星的面试官说没有见过这个格式的。。O(∩_∩)O哈哈~
尤其是ustrlen(unsigned char data[])  这个
2009-4-20 17:27
0
雪    币: 239
活跃值: (12)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
小弟不才,想请问一下楼主大哥的算法。
for(;data[i];(data[i++] & 0xFF) > 127 ? ++i:i, ++count);
0xFF是255,小弟知道
(data[i++] & 0xFF) > 127 这里做比较是什么意思?
望楼主大哥赐教。小弟是菜鸟
2009-4-20 17:30
0
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
unsigned char  ustrlen(unsigned char data) {   
     // 针返回值是无符号CHAR型
     //传递一个unsgined char 类型指针,最大可传递256个英文字符
        unsigned char i;
        while(!data){
                 i++ ;              //判断英文大小
           data++;
        }
       return i;
}
都是无符号整数,运行要比你的快
2009-4-20 17:38
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
to:edison黄
(data[i++] & 0xFF) > 127

这句是判断是否是中文
-------------------------------------
to:孤行有你

你写的代码有问题,结果不正确.
2009-4-20 17:59
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
如果只是英文的话。
int ustrlen(char *lpszStr)
{
        for(int i = -1; lpszStr[++i];);
        return i;
}
2009-4-20 18:21
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=;]...[/QUOTE]
好像没有考虑uft-8,ucs-2等各种编码,单靠比较是否大于127不能涵盖所有情况吧。。。
2009-4-20 20:09
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
8
发个递归版。。。
int ustrlen(char *s) {
        int r = 0;
        if (*(s+1)) r += ustrlen(s+1);
        else return 1;
        return ++r;
}
2009-4-20 20:19
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
9
来个复杂版的
int ustrlen(char data[])
{
  int count = 0;

  while(*data)
  {
      data += ((*data>>7) ? 2 : 1);
      ++count;
  }

  return count;
}
2009-4-21 02:03
0
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=雲飛揚;609461]to:edison黄
(data[i++] & 0xFF) > 127

这句是判断是否是中文
-------------------------------------
to:孤行有你

你写的代码有问题,结果不正确.[/QUOTE]

=
to:
tabel={0x12,0x12,0x12,0x120x12,0x12};
我传递的是一个指针,
这样是可以用的,我在单片机上这样用过
2009-4-21 10:45
0
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
if (*(s+1)) r += ustrlen(s+1); 这句我眼晕!!啊。。。
2009-4-21 10:48
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
-----------------------------

不知你有没有在电脑上运行过你写的这段程序

unsigned char ustrlen(unsigned char data) {
unsigned char i; // 这句没有初始化,后面做处理直接用的话,值能正确吗?
while(!data){ // 判断也不对,如果传进来的值有效的话,你取反之后变为假,里面的语句不会执行
i++ ; // 无符号 char 范围是不是太小了?也没有考滤中文情况啊.
data++;
}
return i;
}
2009-4-21 11:05
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=小虾;609471]如果只是英文的话。
int ustrlen(char *lpszStr)
{
        for(int i = -1; lpszStr[++i];);
        return i;
}[/QUOTE]

------------------

没想到给版主和编程小组的人都引来了~~~

i 不能直接在 for 中定义吧,你这好像是 Java 的用法.
2009-4-21 11:14
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
确实, 代码逻辑都不正确啊
所以要写上针对情况以及局限性等, 不然别人无法写出更有效的来, 只能针对你的现有代码优化, 潜力有限
2009-4-21 11:25
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
-----------------------
不能说 "代码逻辑都不正确" 吧?

这个函数不可能把所有的编码都考虑进去吧,以后要是再出几个 UTF64/UTF65...N种编码的话,一个函数能都考虑进去吗?

C 的标准类库也不会也不会考虑这么多吧.如果定的条条框框太多,就失去灵活性了,当然也就容易出错,全靠自已掌握,这就是C语言.
2009-4-21 11:37
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
16
那是C++的语法。改成C语法也很简单。
int ustrlen(char *lpszStr)
{
  int i;
  for(i = -1; lpszStr[++i];);
  return i;
}
2009-4-21 11:38
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
17
严重不同意这句话!一款语言强大不强大还是要看使用者的熟练程度和编程能力的!
2009-4-21 12:06
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
// 去掉一个比较操作。。
int ustrlen(unsigned char data[])
{
        int i = 0, j, count = 0;
       
        for( ; data[i]; j = (data[i++] >> 7), i += j, count++ );

        return count;
}
2009-4-21 12:20
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=sojoo;609770]// 去掉一个比较操作。。
int ustrlen(unsigned char data[])
{
        int i = 0, j, count = 0;
       
        for( ; data[i]; j = (data[i++] >> 7), i += j, count++ );

        return count...[/QUOTE]
----------------------------

如果不用比较的话,也可以这样,这个效率应更高一些吧.
int ustrlen(unsigned char data[])
{
  int i = 0, count = 0;
  
  for(;data[i]; i += data[i++] >> 7, ++count);

  return count;
}

int main(int argc, char *argv[])
{
    printf("count: %d\n", ustrlen("卡拉,OK"));
    
    return 0;
}
2009-4-21 14:04
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
-------------------------------
你说的这句话,也没错~~~
不过,我的意思是语言,抛弃人为因素的!

如果有人能用脚本语言写一个操作系统的话,那我认为这个人是超人,不过话说回来,他的运行效率会怎么样呢?
2009-4-21 14:30
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
21
....................
2009-4-21 14:33
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
22
写在一行就牛逼吗?
#include <stdio.h>
 
int
ustrlen(char *s)
{
 unsigned long i;
 unsigned char c;
 
 for (i = 0; c = *s++; i++)
   s += c >> 7;
 return i;
}
 
int main(int argc, char *argv[])
{
    printf("count: %d\n", ustrlen("¿¨À­,OK"));
    
    return 0;
}
2009-4-21 14:38
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
23
如果有人能用脚本语言写一个操作系统的话,那我认为这个人是超人,不过话说回来,他的运行效率会怎么样呢?

脚本语言是什么都不懂 就讲这话 真是可笑.

还有, 别把高级语言当神拜.
2009-4-21 14:45
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
24
去了解了解什么是脚本语言吧.
2009-4-21 14:46
0
雪    币: 251
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
--------------------
首先我不喜欢你的这种说话方式,请用文明语言!
我发帖的意思是和大家一起学习,提高自已,没有炫耀的意思,我发帖的时候说了,想达到最简洁最高效
简洁的意思,大家都明白吧.
2009-4-21 14:47
0
游客
登录 | 注册 方可回帖
返回
//