能力值:
( 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[]) 这个
能力值:
( LV3,RANK:20 )
3 楼
小弟不才,想请问一下楼主大哥的算法。
for(;data[i];(data[i++] & 0xFF) > 127 ? ++i:i, ++count);
0xFF是255,小弟知道
(data[i++] & 0xFF) > 127 这里做比较是什么意思?
望楼主大哥赐教。小弟是菜鸟
能力值:
( LV2,RANK:10 )
4 楼
unsigned char ustrlen(unsigned char data) {
// 针返回值是无符号CHAR型
//传递一个unsgined char 类型指针,最大可传递256个英文字符
unsigned char i;
while(!data){
i++ ; //判断英文大小
data++;
}
return i;
}
都是无符号整数,运行要比你的快
能力值:
( LV2,RANK:10 )
5 楼
to:edison黄
(data[i++] & 0xFF) > 127
这句是判断是否是中文
-------------------------------------
to:孤行有你
你写的代码有问题,结果不正确.
能力值:
(RANK:410 )
6 楼
如果只是英文的话。
int ustrlen(char *lpszStr)
{
for(int i = -1; lpszStr[++i];);
return i;
}
能力值:
( LV2,RANK:10 )
7 楼
[QUOTE=;]...[/QUOTE]
好像没有考虑uft-8,ucs-2等各种编码,单靠比较是否大于127不能涵盖所有情况吧。。。
能力值:
(RANK:1290 )
8 楼
发个递归版。。。
int ustrlen(char *s) {
int r = 0;
if (*(s+1)) r += ustrlen(s+1);
else return 1;
return ++r;
}
能力值:
( LV12,RANK:403 )
9 楼
来个复杂版的
int ustrlen(char data[])
{
int count = 0;
while(*data)
{
data += ((*data>>7) ? 2 : 1);
++count;
}
return count;
}
能力值:
( LV2,RANK:10 )
10 楼
[QUOTE=雲飛揚;609461]to:edison黄
(data[i++] & 0xFF) > 127
这句是判断是否是中文
-------------------------------------
to:孤行有你
你写的代码有问题,结果不正确.[/QUOTE]
=
to:
tabel={0x12,0x12,0x12,0x120x12,0x12};
我传递的是一个指针,
这样是可以用的,我在单片机上这样用过
能力值:
( LV2,RANK:10 )
11 楼
if (*(s+1)) r += ustrlen(s+1); 这句我眼晕!!啊。。。
能力值:
( LV2,RANK:10 )
12 楼
-----------------------------
不知你有没有在电脑上运行过你写的这段程序
unsigned char ustrlen(unsigned char data) {
unsigned char i; // 这句没有初始化,后面做处理直接用的话,值能正确吗?
while(!data){ // 判断也不对,如果传进来的值有效的话,你取反之后变为假,里面的语句不会执行
i++ ; // 无符号 char 范围是不是太小了?也没有考滤中文情况啊.
data++;
}
return i;
}
能力值:
( LV2,RANK:10 )
13 楼
[QUOTE=小虾;609471]如果只是英文的话。
int ustrlen(char *lpszStr)
{
for(int i = -1; lpszStr[++i];);
return i;
}[/QUOTE]
------------------
没想到给版主和编程小组的人都引来了~~~
i 不能直接在 for 中定义吧,你这好像是 Java 的用法.
能力值:
( LV2,RANK:10 )
14 楼
确实, 代码逻辑都不正确啊
所以要写上针对情况以及局限性等, 不然别人无法写出更有效的来, 只能针对你的现有代码优化, 潜力有限
能力值:
( LV2,RANK:10 )
15 楼
-----------------------
不能说 "代码逻辑都不正确" 吧?
这个函数不可能把所有的编码都考虑进去吧,以后要是再出几个 UTF64/UTF65...N种编码的话,一个函数能都考虑进去吗?
C 的标准类库也不会也不会考虑这么多吧.如果定的条条框框太多,就失去灵活性了,当然也就容易出错,全靠自已掌握,这就是C语言.
能力值:
(RANK:410 )
16 楼
那是C++的语法。改成C语法也很简单。
int ustrlen(char *lpszStr)
{
int i;
for(i = -1; lpszStr[++i];);
return i;
}
能力值:
( LV9,RANK:210 )
17 楼
严重不同意这句话!一款语言强大不强大还是要看使用者的熟练程度和编程能力的!
能力值:
( 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;
}
能力值:
( 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;
}
能力值:
( LV2,RANK:10 )
20 楼
-------------------------------
你说的这句话,也没错~~~
不过,我的意思是语言 ,抛弃人为因素的!
如果有人能用脚本语言 写一个操作系统的话,那我认为这个人是超人,不过话说回来,他的运行效率会怎么样呢?
能力值:
( LV9,RANK:850 )
21 楼
....................
能力值:
(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;
}
能力值:
( LV6,RANK:80 )
23 楼
如果有人能用脚本语言写一个操作系统的话,那我认为这个人是超人,不过话说回来,他的运行效率会怎么样呢?
脚本语言是什么都不懂 就讲这话 真是可笑.
还有, 别把高级语言当神拜.
能力值:
( LV6,RANK:80 )
24 楼
去了解了解什么是脚本语言吧.
能力值:
( LV2,RANK:10 )
25 楼
--------------------
首先我不喜欢你的这种说话方式,请用文明语言 !
我发帖的意思是和大家一起学习,提高自已,没有炫耀的意思 ,我发帖的时候说了,想达到最简洁 最高效
简洁的意思,大家都明白吧.