Skip to content

Commit 51eb43c

Browse files
committed
fix(cstdlib/mblen): 内部状態と std::mbrlen を言及
1 parent 8faf543 commit 51eb43c

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

reference/cstdlib/mblen.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ namespace std {
1818
1919
`n`は解析に使用する最大バイト数を指定する。
2020
21+
この関数は `std::mbstate_t` に等価な静的記憶域の内部状態を保持し、前回の `mblen` 関数呼び出しの続きとして処理を行う。
22+
従って、この関数はスレッドセーフではない。
23+
スレッドセーフに処理する場合は、`std::mbstate_t` を受け取る [`std::mbrlen`](../cwchar/mbrlen.md.nolink) (`<cwchar>`) を使い、呼び出し元でデコード状態の記録場所 `std::mbstate_t` を用意する。
24+
2125
## 戻り値
2226
- 正常に動作する場合、文字の占めるバイト数を返す。
2327
- `str`が`nullptr`の時、内部状態を初期化し`0`を返す。
@@ -57,7 +61,7 @@ int count_chars_mblen(const char* s) {
5761
int count = 0;
5862
std::size_t i = 0;
5963
std::size_t bytes = std::strlen(s);
60-
while (s[i] != '\0') {
64+
while (i < bytes) {
6165
int len = std::mblen(&s[i], bytes - i);
6266
if (len < 0) {
6367
len = 1;
@@ -77,8 +81,15 @@ int main() {
7781
}
7882
```
7983
84+
注意: この例は飽くまで `std::mblen` を用いて文字数を数える関数の例であるが、実用上は `std::mbrlen` を用いた実装にするのが安全である。
85+
上の関数 `count_chars_mblen` はスレッドーセーフでない他、呼び出し元でも `std::mblen` を使っている場合にその振る舞いを破壊する可能性がある。
86+
8087
#### 出力例
8188
```
8289
文字列: こんにちは世界
8390
文字数: 7
8491
```
92+
93+
## 関連項目
94+
95+
- [`mbrlen`](../cwchar/mbrlen.md.nolink): `std::mbstate_t` を受け取るスレッドセーフなバージョン

0 commit comments

Comments
 (0)