mblen函数
概要:
#include <stdlib.h>
int mblen(const char *s, size_t n);
描述:
该函数可用于确定多字节字符的字节数。
如果参数s不是空指针,mblen函数可以确定参数s指向多字节字符的字节数。
除了mbtowc函数的转换状态(conversion state)不受影响,mblen函数等价于
mbtowc((wchar_t *)0, (const char *)0, 0);
mbtowc((wchar_t *)0, s, n);
mblen函数会受当前语言环境LC_CTYPE类别的影响。函数在程序启动时处于初始转换状态,调用mblen(NULL, 0);可以返回该状态;随后在参数s不是空指针的情况下调用该函数,内部转换状态将根据需要进行改变。改变LC_CTYPE类别会导致函数的转换状态不确定。
实现应像没有库函数调用mblen函数一样。
参数:
const char *s
指向多字节字符第一个字节的指针。
size_t n
最多检查的字节数。
返回值:
在参数s是空指针的情况下,如果多字节字符的编码与状态有关(state-dependent encodings),函数返回一个非0值;如果多字节字符的编码与状态无关,函数返回0。
在参数s不是空指针的情况下,如果参数s指向空字符,函数返回0;如果参数s指向的不超过n个字节能够形成有效多字节字符,函数返回形成有效多字节字符的字节数;如果不能形成有效多字节字符,函数返回-1。
范例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
/*函数mblen范例*/
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*声明统计字符和字节数的函数。*/
int countCharacter(const char *begin);
int main(void)
{
setlocale(LC_ALL, "");
const char *ptr = "AI我中华";
printf("字符串: %s\n", ptr);
printf("总字节数: %zu\n", strlen(ptr)+1);
printf("总字符数: %d\n", countCharacter(ptr));
return 0;
}
/*定义统计字符和字节数的函数。*/
int countCharacter(const char *begin)
{
int count = 0; //记录字符个数。
int numberOfBytes = 0; //单个字符占有的字节数。
const char *end = begin + strlen(begin); //指向字符串末尾字节的指针。
mblen(NULL, 0); //初始化转换状态。
printf("各个字符占有的字节数: ");
while(begin <= end)
{
/*处理终止空字符。*/
if(*begin == 0)
{
numberOfBytes = 1;
printf(" %d ", numberOfBytes);
++count;
break;
}
/*处理非终止空字符的其它字符。*/
numberOfBytes = mblen(begin, MB_CUR_MAX);
if(numberOfBytes == -1)
{
puts("指向字符序列不能形成有效的多字节字符。");
break;
}
else
{
printf(" %d ", numberOfBytes);
++count;
begin += numberOfBytes; //指针指向下一个字符。
}
}
puts("");
return count;
}
|
输出:
字符串: AI我中华
总字节数: 12
各个字符占有的字节数: 1 1 3 3 3 1
总字符数: 6
注:使用ideone编译。
相关内容: