当前位置: C语言 -- 标准库 -- <stdlib.h> -- mblen

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编译。


相关内容:
mbtowc 将多字节字符序列转换为宽字符的函数。
wctomb 将宽字符转换为多字节字符序列的函数。