当前位置: 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 
/*函数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我中华";
    int charCount = 0;
    
    printf("字符串: %s\n", ptr);
    printf("总字节数: %zu\n", strlen(ptr));
    if((charCount = countCharacter(ptr)) > 0)
    {
        printf("总字符数: %d\n", charCount);
    }
    else
    {
        printf("字符统计失败。\n");
    }
    
    return 0;
}

/*定义统计字符和字节数的函数。*/
int countCharacter(const char *begin)
{
    int count = 0;  //记录字符个数。
    int numberOfBytes = 0;      //单个字符占有的字节数。
    
    mblen(NULL, 0);     //初始化转换状态。
    printf("各个字符占有的字节数: ");
    while(*begin != '\0')
    {
        /*处理非终止空字符的其它字符。*/
        numberOfBytes = mblen(begin, MB_CUR_MAX);
        if(numberOfBytes == -1)
        {
            puts("指向字符序列不能形成有效的多字节字符。");
            return -1;
        }
        
        printf(" %d", numberOfBytes);
        ++count;
        begin += numberOfBytes;     //指针指向下一个字符。
 
    }
    puts("");
    
    return count;
}


输出:

字符串: AI我中华

总字节数: 11

各个字符占有的字节数: 1 1 3 3 3

总字符数: 5

(注:使用ideone编译。)


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


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018