函数
<cstdlib>

mblen

int mblen (const char* pmb, size_t max);
获取多字节字符的长度
返回指向 pmb 的多字节字符的大小,最多检查 max 个字节。

mblen 有自己的内部移位状态,该状态仅由对该函数的调用按需修改。使用空指针作为 pmb 调用该函数会重置状态(并返回多字节字符是否与状态相关)。

此函数的行为取决于所选 C localeLC_CTYPE 类别。

参数

pmb
指向多字节字符第一个字节的指针。
或者,可以使用空指针调用该函数,在这种情况下,该函数将其内部移位状态重置为初始值,并返回多字节字符编码是否与状态相关。
max
考虑 pmb 以构成多字节字符的最大字节数。
无论如何,最多检查 MB_CUR_MAX 个字符。
size_t 是一个无符号整数类型。

返回值

如果作为 pmb 传递的参数不是空指针,并且它构成了一个有效多字节字符且不是终止空字符,则返回指向的字符的大小(以字节为单位)。如果它是终止空字符,则函数返回零;如果它们未构成有效多字节字符,则返回 -1

如果作为 pmb 传递的参数是空指针,则如果多字节字符编码与状态相关,该函数返回一个非零值,否则返回零。

示例

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
/* mblen example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* mblen, mbtowc, wchar_t(C) */

void printbuffer (const char* pt, size_t max)
{
  int length;
  wchar_t dest;

  mblen (NULL, 0);         /* reset mblen */
  mbtowc (NULL, NULL, 0);  /* reset mbtowc */

  while (max>0) {
    length = mblen (pt, max);
    if (length<1) break;
    mbtowc(&dest,pt,length);
    printf ("[%lc]",dest);
    pt+=length; max-=length;
  }
}

int main()
{
  const char str [] = "test string";

  printbuffer (str,sizeof(str));

  return 0;
}

printbuffer 逐个字符地打印多字节字符串。

示例使用了一个使用 "C" 区域设置的简单字符串,但该函数支持解释多字节字符串的区域设置。

输出

[t][e][s][t][ ][s][t][r][i][n][g]


数据竞争

该函数访问由 pmb 指向的数组。
该函数还访问和修改内部状态对象,这可能导致对该函数的并发调用发生数据争用(有关可能使用外部状态对象的替代方法,请参阅 mbrlen)。
并发地更改 locale 设置也可能引入数据竞争。

异常 (C++)

无抛出保证:此函数不会抛出异常。

如果 pmb 既不是空指针也不是指向足够长的数组的指针(如上所述),则会导致未定义行为

另见