计算中文字符串的长度 -- C语言
·
思路
计算 含有 汉字 的 字符串 的 长度, 汉字 作为 一个 字符 处理; 已知: 汉字编码 为 双 字节, 其中 首 字节< 0, 尾 字节 在 0 ~ 63 以外( 如果 一个 字节 是 − 128 ~ 127)。
注意:每个系统实现的编码机制不是很一样,在我的机器上,按照的是centos7,汉子的编码是3个字节,所以发现汉字之后,指针应该从当前位置向后移动三个字节,即 p = p + 3
调试信息如下
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/renmian/interview/a.exe...done.
(gdb) b str.c:796
Breakpoint 1 at 0x401fd2: file str.c, line 796.
(gdb) r
Starting program: /home/renmian/interview/./a.exe
Breakpoint 1, gbkstrlen (str=0x7fffffffe450 "abc你好123中国456") at str.c:796
796 p = p + 2;
(gdb) p p
$1 = 0x7fffffffe453 "你好123中国456"
(gdb) p *p
$8 = -28 '\344'
(gdb) p *(p+1)
$9 = -67 '\275'
(gdb) p *(p+2)
$10 = -96 '\240'
(gdb) p *(p+3)
$11 = -27 '\345'
(gdb) p *(p+4)
$12 = -91 '\245'
(gdb) p *(p+5)
$13 = -67 '\275'
(gdb) p *(p+6)
$14 = 49 '1'
(gdb) quit
A debugging session is active.
Inferior 1 [process 17620] will be killed.
代码实现
int gbkstrlen(char * str){
if(NULL == str){
printf("mystrcat param error\n");
return PARAM_ERR;
}
int len = 0;
char * p = str;
while('\0' != *p){
/*中文字符直接跳过2个字符*/
if(*p < 0 && (*(p + 1) < 0 || *(p + 1) > 63)){ /*中文字符*/
p = p + 3;
} else {
p++;
}
len++;
}
return len;
}
void testgbkstrlen(void){
char str[100] = "abc你好123中国456";
int len = 0;
printf("\n************ testgbkstrlen ************ \n");
len = gbkstrlen(str);
printf("gbk string lenght is : %d\n", len);
return;
}
代码编译
gcc main.c str.c -g -o a.exe
调试输出
************ testgbkstrlen ************
gbk string lenght is : 13
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)