C言語の文字列処理

コンテンツへジャンプ
フリー百科事典『ウィキペディア』より
( Memccpyからリダイレクト

Cプログラミング言語には、標準ライブラリに文字列(文字列とバイト文字列)に対する操作を実装する一連の関数があります。コピー、連結トークン化、検索など、さまざまな操作がサポートされています。文字列の場合、標準ライブラリは文字列をNULLで終了するという規則を使用します。つまり、 n文字の文字列はn + 1個の要素の配列として表現され、最後の要素は数値0の 「 NUL文字」です

プログラミング言語自体における文字列の唯一のサポートは、コンパイラが引用符で囲まれた文字列定数をnull で終わる文字列に変換することです。

定義

[編集]

文字列は、最初のゼロコード単位(NULコード単位と呼ばれることが多い)で終了する連続したコード単位のシーケンスとして定義されます。[ 1 ]これは、最初のゼロコード単位が文字列の終わりを示すため、文字列にゼロコード単位を含めることができないことを意味します。文字列の長さは、ゼロコード単位の前のコード単位の数です。[ 1 ]文字列が占めるメモリは、ゼロ終端を格納するためのスペースが必要であるため、常に長さよりも1コード単位多くなります

一般的に、「文字列」という用語は、コード単位が 型の文字列を指しますchar。これは、すべての現代のマシンではちょうど8ビットです。C90では、型のコード単位を使用するワイド文字列[ 1 ]が定義されていますwchar_t。これは現代のマシンでは16ビットまたは32ビットです。これはUnicodeを対象としていましたが、 Unicodeの通常の文字列ではUTF-8を使用するのがますます一般的になっています。

文字列は、最初のコードユニットへのポインタを渡すことで関数に渡されます。char*と はwchar_t*異なる型であるため、ワイド文字列を処理する関数は通常の文字列を処理する関数とは異なり、異なる名前を持ちます。

文字列リテラル"text"Cソースコード内)は、コンパイル時に配列(char[]Cまたはconst char[]C++)に変換されます。[ 2 ]結果は、すべての文字と末尾のゼロコード単位を含むコード単位の配列です。C90ではL"text"ワイド文字列を生成します。文字列リテラルにはゼロコード単位を含めることができます(1つの方法は\0ソースに配置することです)が、これにより文字列はその時点で終了してしまいます。リテラルの残りの部分はメモリに配置されます(末尾に別のゼロコード単位が追加されます)が、これらのコード単位が文字列リテラルから変換されたことを知ることは不可能であるため、そのようなソースコードは文字列リテラルではありません[ 3 ]

文字エンコーディング

[編集]

char各文字列は、適切な種類のゼロコード単位(または)の最初の出現で終了しますwchar_t。したがって、バイト文字列(char*)には、 ASCIIまたは任意のASCII拡張のNUL以外の文字を含めることができますが、 UTF-16などのエンコーディングの文字を含めることはできません(16ビットのコード単位がゼロ以外の場合でも、上位バイトまたは下位バイトがゼロになる可能性があります)。ワイド文字列に格納できるエンコーディングは、の幅によって定義されます。ほとんどの実装では、は少なくとも16ビットであるため、UCS-2などのすべての16ビットエンコーディングを格納できます。が32ビットの場合、UTF-32などの32ビットエンコーディングを格納できます(標準では「任意のワイド文字を保持できる型」が求められているが、WindowsではUCS-2からUTF-16への移行以降、この要件は満たされなくなった。これは標準の欠陥として認識され、C++で修正された。)[ 4 ] C++11とC11では、明示的な幅を持つ2つの型とが追加されている[ 5 ]wchar_twchar_twchar_tchar16_tchar32_t

可変幅エンコーディングは、バイト文字列とワイド文字列の両方で使用できます。文字列の長さとオフセットはwchar_t「文字数」ではなくバイト数またはバイト単位で測定されるため、初心者プログラマーにとっては混乱を招く可能性があります。UTF -8Shift JISはC言語のバイト文字列でよく使用され、UTF-16は16ビットのC言語のワイド文字列でよく使用されますwchar_t。可変幅文字を含む文字列を関数などの関数で切り捨てると、strncpy文字列の末尾に無効なシーケンスが生成されることがあります。切り捨てられた部分が、入力が有効であると想定するコードによって解釈される場合、これは安全ではない可能性があります。

(UTF-8) や(UTF-16 または UTF-32、 に依存)などの Unicode リテラルのサポートは実装定義であり、 [ 6 ]ソースコードが同じエンコーディングであることが必要になる場合があります (特にコンパイラが引用符で囲まれた内容をコピーするだけの場合)。 コンパイラやエディタによっては、UTF-8 の各バイトや UTF-16 の各ワードごとに、すべての非 ASCII 文字をシーケンスとして入力する必要があります。 C11 (および C++11) 以降では、のように、バイト文字列リテラルに対して UTF-8 を保証する新しいリテラル プレフィックスが利用できます[ 7 ] C++20およびC23以降ではUTF-8 文字を格納するための型が追加され、u8 プレフィックス付き文字リテラルと文字列リテラルの型はそれぞれ と に変更されましchar foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNu8char foo[512] = u8"φωωβαρ";char8_tchar8_tchar8_t[]

機能

[編集]

用語

[編集]

歴史的なドキュメントでは、Cの文字列に対して「バイト」ではなく「文字」という用語がよく使われていました。そのため、多くの人誰?)は、これらの関数がUTF-8では動作しないと信じています。実際には、すべての長さはバイト単位で定義されており、これはすべての実装に当てはまり、これらの関数はUTF-8でもシングルバイトエンコーディングと同様に動作します。BSDのドキュメントはこれを明確にするために修正されましたが、POSIX、Linux、およびWindowsのドキュメントでは、多くの箇所で「バイト」または「wchar_t」が正しい用語であるにもかかわらず、依然として「文字」が使用されています

メモリバッファを処理する関数は、データの一部としてヌルバイトを含むバイトシーケンスを処理できます。これらの関数の名前は通常、接頭辞memの反対である ,で始まりますstr

ヘッダー

[編集]

Cの文字列を操作する関数のほとんどはstring.hヘッダー(cstringC++の場合)で宣言されていますが、Cのワイド文字列を操作する関数はwchar.hヘッダー(cwcharC++の場合)で宣言されています。これらのヘッダーには、メモリバッファの処理に使用される関数の宣言も含まれているため、この名前は少し誤解を招く可能性があります

で宣言された関数は、 C標準ライブラリstring.hの一部として、Cをサポートするあらゆるプラットフォームで動作することが保証されているため、非常に人気があります。しかし、これらの関数には、注意深く適切に使用しないとバッファオーバーフローが発生する可能性があるなど、セキュリティ上の問題がいくつか存在します。そのため、プログラマーはより安全で、かつ移植性が低い可能性のある関数を好みます。以下に、その中で人気のある関数をいくつか挙げます。これらの関数の中には、文字列ポインタを受け入れ、文字列内で非ポインタを返すことで、 constの正確性に違反するものもあります。これを修正するために、 C++版の標準ライブラリでは、 一部の関数が2つのオーバーロード関数に分割されています。constconst

定数と型

[編集]
名前注釈
NULLヌルポインタ定数に展開されるマクロ。つまり、メモリ内のオブジェクトの有効なアドレスではないことが保証されたポインタ値を表す定数です
wchar_t「ワイド」文字列のコード単位に使用される型。C標準では、wchar_tはサポートされているシステムロケール[ 8 ]の中で最も広い文字セットを保持できる幅を持ち、 char [ 9 ]以上のサイズであることのみが要求されています。wchar_t広範に使用する唯一のプラットフォームであるWindowsでは、16ビット[ 10 ]として定義されています。これは、かつてはあらゆるUnicodeUCS-2 )文字を表すのに十分でしたが、現在はUTF-16コード単位(コードポイントの半分)を表すのにしか十分ではありません。他のプラットフォームでは32ビットとして定義されており、Unicodeコードポイントは常に適合します。この違いにより、wchar_tを使用するコードは移植性がありません
wint_twchar_tの任意の値とマクロWEOFの値を保持できる整数型。通常は32ビットの符号付き値です
char8_t [ 11 ]C23以降のC標準の一部で、<uchar.h>にあり、UTF-8文字を格納するのに適した型です。[ 12 ]
char16_t [ 13 ]C11以降のC標準の一部である[ 14 ]。 < uchar.h>では、 wchar_tが別のサイズであっても16ビットを保持できる型である。マクロが1と定義されている場合、そのシステムではUTF-16として使用される。これはC23では常に当てはまる。[ 15 ] C++ではそのようなマクロは定義されていないが、その言語ではUTF-16として常に使用される。[ 16 ]__STDC_UTF_16__
char32_t [ 13 ]C11以降C標準の一部である[ 17 ] 。 <uchar.h>では、 wchar_tが別のサイズであっても32ビットを保持できる型である。マクロが1と定義されている場合、そのシステムではUTF-32として使用される。これはC23では常に当てはまる。[ 15 ] C++ではこのようなマクロは定義されていないが、その言語ではUTF-32として常に使用される。[ 16 ]__STDC_UTF_32__
mbstate_tある関数の呼び出しから別の関数の呼び出しに必要な変換状態に関するすべての情報が含まれています

関数

[編集]
バイト
文字列
幅広
ひも
説明[注1 ]
文字列
操作
strcpy [ 18 ]wcscpy [ 19 ]ある文字列を別の文字列にコピーします
strncpy [ 20 ]wcsncpy [ 21 ]ソースからコピーするかヌルを追加して、正確にnバイトを書き込みます。
strcat [ 22 ]wcscat [ 23 ]一つの文字列を別の文字列に追加する
strncat [ 24 ]wcsncat [ 25 ]ある文字列から別の文字列にnバイト以内を追加します
strxfrm [ 26 ]wcsxfrm [ 27 ]現在のロケールに従って文字列を変換します
文字列の
検査
ストレン[ 28 ]wcslen [ 29 ]文字列の長さを返します
strcmp [ 30 ]wcscmp [ 31 ]2つの文字列を比較します(3者間比較
strncmp [ 32 ]wcsncmp [ 33 ]2つの文字列の特定のバイト数を比較します
ストコル[ 34 ]WCSCOLL [ 35 ]現在のロケールに従って2つの文字列を比較します
ストルチャー[ 36 ]wcschr [ 37 ]文字列内のバイトの最初の出現を検索します
strrchr [ 38 ]wcsrchr [ 39 ]文字列内のバイトの最後の出現箇所を検索します
strspn [ 40 ]wcsspn [ 41 ]文字列の最初のバイト数のうち、2番目の文字列に含まれるバイト数を返します。
strcspn [ 42 ]wcscspn [ 43 ]文字列の最初のバイト数のうち、2番目の文字列に含まれないバイト数を返します。
ストルプブルック[ 44 ]wcspbrk [ 45 ]文字列内でセット内のバイトの最初の出現を検索します
strstr [ 46 ]wcsstr [ 47 ]文字列内の部分文字列の最初の出現を検索します
ストルトック[ 48 ]wcstok [ 49 ]文字列をトークンに分割します
その他ストレラ[ 50 ]該当なしエラーコードから派生したメッセージを含む文字列を返します
メモリ
操作
memset [ 51 ]wmemset [ 52 ]バッファを繰り返しバイトで埋めます。C23以降機密データを消去するためにmemset_explicit()が追加されました。
メモリコピー[ 53 ]wmemcpy [ 54 ]あるバッファを別のバッファにコピーします。C23以降文字列を効率的に連結するためにmemccpy()が追加されました。
メモムーブ[ 55 ]wmemmove [ 56 ]1つのバッファを別のバッファ(重複する可能性がある)にコピーします
メムcmp [ 57 ]wmemcmp [ 58 ]2つのバッファを比較する(3者間比較)
メムチャー[ 59 ]wmemchr [ 60 ]バッファ内のバイトの最初の出現を検索します
  1. ^ ワイド文字列関数については、説明中の「byte」をwchar_tに置き換えてください。

マルチバイト関数

[編集]
名前説明
mblen [ 61 ]次のマルチバイト文字のバイト数を返します
mbtowc [ 62 ]次のマルチバイト文字をワイド文字に変換します
wctomb [ 63 ]ワイド文字をマルチバイト表現に変換します
mbstowcs [ 64 ]マルチバイト文字列をワイド文字列に変換します
トイレストームズ[ 65 ]ワイド文字列をマルチバイト文字列に変換します
btowc [ 66 ]可能であれば、シングルバイト文字をワイド文字に変換します。
wctob [ 67 ]可能であれば、ワイド文字をシングルバイト文字に変換します。
ムブシニット[ 68 ]状態オブジェクトが初期状態を表しているかどうかを確認します
ムブレン[ 69 ]指定された状態で次のマルチバイト文字のバイト数を返します。
ムブルトウク[ 70 ]指定された状態に従って、次のマルチバイト文字をワイド文字に変換します。
wcrtomb [ 71 ]与えられた状態に基づいて、ワイド文字をマルチバイト表現に変換します。
mbsrtowcs [ 72 ]指定された状態に基づいて、マルチバイト文字列をワイド文字列に変換します。
wcsrtombs [ 73 ]指定された状態に基づいてワイド文字列をマルチバイト文字列に変換します。
mbrtoc8 [ 74 ]指定された状態に従って、次のマルチバイト文字を UTF-8 文字に変換します。
クトゥルトン[ 75 ]指定された状態に基づいて、単一のコードポイントをUTF-8からナローマルチバイト文字表現に変換します。
mbrtoc16 [ 76 ]指定された状態に従って、次のマルチバイト文字を UTF-16 文字に変換します。
16世紀頃の墓[ 77 ]指定された状態に基づいて、単一のコードポイントをUTF-16からナローマルチバイト文字表現に変換します。
mbrtoc32 [ 78 ]指定された状態に従って、次のマルチバイト文字を UTF-32 文字に変換します。
c32rtomb [ 79 ]指定された状態に基づいて、UTF-32 から狭いマルチバイト文字表現に単一のコードポイントを変換します。

これらの機能はすべてmbstate_tオブジェクト。元々は静的メモリに格納されていたため、関数はスレッドセーフではありませんでした。後から追加されたオブジェクトでは、呼び出し側が管理する必要がありました。これは元々、関数のシフト状態を追跡することを目的としていましたmbエンコーディングにはUTF-8などの最新のエンコーディングは必要ありません。ただし、これらの関数は、wcエンコードは可変幅エンコードではないため、正確に1つの文字を処理するように設計されていますwchar_t一度に1つずつ、文字列ポインタではなく値で渡します。UTF-16は可変幅エンコーディングであるため、mbstate_tワイドエンコーディングのサロゲートペアを追跡するために再利用されているが、呼び出し側は依然として検出して呼び出す必要がある。mbtowc1文字につき2回。[ 80 ] [ 81 ] [ 82 ]標準のその後の追加では、プログラマが関心を持つ唯一の変換はUTF-8とUTF-16の間であることが認められ、これを直接提供しています。

数値変換

[編集]
バイト
文字列
幅広
ひも
説明[注1 ]
アトフ[ 83 ]該当なし文字列を浮動小数点値に変換します(「atof」は「ASCIIから浮動小数点」を意味します)
アトイ環礁[ 84 ]

該当なし文字列を整数に変換します(C99)(「atoi」は「ASCIIから整数」を意味します)
strtof ( C99 ) [ 85 ] strtod [ 86 ] strtold ( C99 ) [ 87 ]

wcstof ( C99 ) [ 88 ] wcstod [ 89 ] wcstold ( C99 ) [ 90 ]

文字列を浮動小数点値に変換する
strtol strtoll [ 91 ]
wcstol wcstoll [ 92 ]
文字列を符号付き整数に変換する
strtoul strtoul [ 93 ]
ウクストウルウクストウル[ 94 ]
文字列を符号なし整数に変換する
  1. ^ ここで文字列はバイト文字列またはワイド文字列のいずれかを指します

C標準ライブラリには、数値変換のための関数がいくつか含まれています。バイト文字列を扱う関数はstdlib.hヘッダー(cstdlibC++では header )で定義されています。ワイド文字列を扱う関数はwchar.hヘッダー(cwcharC++では header )で定義されています。

関数strchr、、、、、およびそれらのワイド対応関数bsearch、文字列ポインタを受け取り、文字列内で非ポインタを返すためstrpbrkconst 正しくありません。これはC23で修正されました。[ 95 ]strrchrstrstrmemchrconstconst

また、規範修正第1版(C95)以降、atoxx関数は関数に包含されると考えられておりstrtoxxx、そのためC95もそれ以降の標準もこれらの関数のワイド文字版を提供していない。これに対する反論は、atoxxエラーとを区別していないというものである0[ 96 ]

[編集]

BSDSVIDPOSIXなど、いくつかの関連標準では、標準Cが提供する文字列処理機能が拡張されています。こうした関数の一部は、最近のC標準( C11C23など)にも追加されています

名前出典説明
bzero [ 97 ]4.2BSD、POSIX.1-2001バッファをゼロにします。memsetにより非推奨となり POSIX.1-2008で削除されました
memccpy [ 98 ]4.4BSD、SVID4、POSIX.1-2001、C23重複しない 2 つのバッファ間でコピーし、指定されたバイトが見つかったら停止します。
memppcpy [ 99 ]GNU重複しない2つのバッファ間でコピーを行い、最後に書き込まれたバイトの次のバイトへのポインタを返します
strcasecmp , strncasecmp [ 100 ]4.4BSD、POSIX.1-2001それぞれstrcmpstrncmpの大文字と小文字を区別しないバージョン
strcat_s , [ 101 ] strncat_s [ 102 ]Windows、C11それぞれstrcatstrncatの境界チェックバージョンです
strcpy_s , [ 103 ] strncpy_s [ 104 ]Windows、C11それぞれstrcpystrncpyの境界チェックバージョンです
strdupstrndup [ 105 ]POSIX.1-2001, C23メモリを割り当て、そこに文字列を複製します。
strerror_r [ 106 ]POSIX.1-2001、GNUstrerrorのスレッドセーフ版。GNU版はPOSIX版と互換性がありません
strlcpy [ 107 ]POSIX.1-2024strcpyの派生関数で、結果を切り捨てて出力バッファに収まるようにします。[ 108 ]
strlcat [ 107 ]POSIX.1-2024strcatの変種で、結果を切り捨てて宛先バッファに収まるようにします。[ 108 ]
strsignal [ 109 ]SVID3、POSIX.1-2008シグナルコードの文字列表現を返します
strtok_r [ 110 ]POSIX.1-1996strtokのスレッドセーフ版

strlcpy、strlcat

[編集]

[ 22 ][ 18 ]をバッファオーバーフローを許さない関数に置き換える必要性が十分に認識されているにもかかわらず、標準規格は未だ確立されていません。これは、多くのCプログラマが、が望ましい動作をするだろうと誤解していることが一因です。しかし、どちらの関数もそのような動作をするために設計されたものではありません(これらは、現代のソフトウェアではあまり使用されていないデータ形式である、ヌルパディングされた固定サイズの文字列バッファを操作することを目的としていました)。また、その動作と引数は直感的ではなく、熟練したプログラマでさえも誤って記述してしまうことがよくあります。[ 108 ]strcatstrcpystrncatstrncpy

最も人気のある[ a ]代替はstrlcat[ 111 ]関数とstrlcpy[ 112 ]関数で、1998 年 12 月にOpenBSD 2.4 で登場しました。 [ 108 ]これらの関数は常に 1 つの NUL を宛先バッファに書き込み、必要に応じて結果を切り捨て、必要なバッファのサイズを返します。これにより、切り捨てを検出し、切り捨てられない新しいバッファを作成するためのサイズが提供されます。長い間、これらの関数は、非効率であると言われていること、 [ 113 ] C 文字列(より優れた代替形式の文字列の代わりに) の使用を推奨すること、[ 114 ] [ 115 ]その他の潜在的なエラーを隠すことなどの理由で、GNU C ライブラリ (Linux 上のソフトウェアで使用) には含まれていませんでした。[ 116 ] [ 117 ] glibcがサポートを追加していなかった間も、strlcatとstrlcpyはOpenBSD、FreeBSDNetBSDSolarisOS XQNXなどの他のCライブラリ、および2008年に導入されたlibbsd [ 118 ]2011年に導入されたmusl [ 119 ] [ 120 ]などのLinux用の代替Cライブラリを含む多くのCライブラリに実装されており、ソースコードはSDLGLibffmpegrsyncなどの他のプロジェクトに直接追加され、 Linuxカーネル内部にも追加されました。これは2024年に変更されましたが、glibcのFAQではglibc 2.38の時点でコードがコミットされ[ 121 ]追加されたと述べています。[ 122 ]これらの関数はPOSIX.1-2024の一部として標準化されました。[ 123 ] Austin Group Defect Tracker ID 986はPOSIXのそのような計画に関するいくつかの議論を追跡しました。

2004年のセキュリティ開発ライフサイクルの一環として、Microsoftはstrcpy_s、およびstrcat_s(その他多数の関数とともに)を含む「セキュア」関数群を導入しました。 [ 124 ]これらの関数は、ISO/IEC WDTR 24731で提案されたオプションのC11(附属書K)の一部として、若干の変更を加えて標準化されました。 [ 125 ]これらの関数は、文字列がバッファに収まらないほど長すぎないかどうかなど、様々なチェックを実行します。チェックに失敗した場合、ユーザーが指定した「ランタイム制約ハンドラー」関数が呼び出され、[ 126 ]通常はプログラムを中止します。[ 127 ] [ 128 ]これらの関数は、当初Windowsのみに実装されていたこと、そしてMicrosoft Visual C++で標準関数ではなくこれらの関数の使用を推奨する警告メッセージが表示されるようになったことから、かなりの批判を浴びました。これは、Microsoftが開発者を自社プラットフォームに閉じ込めようとする試みではないかと推測する声もあります。[ 129 ]これらの関数の使用経験から、その採用と使用上の誤りに重大な問題があることが示されたため、C標準の次の改訂では附属書Kの削除が提案されました。[ 130 ]memset_s不要なコンパイラ最適化を回避する方法としての使用が提案されています。 [ 131 ] [ 132 ]

参照

[編集]

[編集]
  1. GitHubでは、 の使用回数は7,813,206回であるのstrlcpyに対し、 の使用回数は38,644回strcpy_s( の使用回数は15,286,150回strcpy)です。 [要出典]

参考文献

[編集]
  1. ^ a b c 「C99標準ドラフト + TC3」 (PDF) §7.1.1p1 2011年1月7日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
  2. ^ 「C99標準ドラフト + TC3」(PDF) §6.4.5p7 。 2011年1月7日閲覧 {{cite web}}: CS1 メンテナンス: 場所 (リンク)
  3. ^ 「C99標準ドラフト + TC3」(PDF) . 6.4.5節脚注66. 2011年1月7日閲覧 {{cite web}}: CS1 メンテナンス: 場所 (リンク)
  4. ^ 「既存の慣行に合わせて wchar_t の要件を緩和する」(PDF)
  5. ^ 「基本型」 . en.cppreference.com .
  6. ^ 「C99標準草案 + TC3」(PDF) §5.1.1.2翻訳フェーズ、p1 。 2011年12月23日閲覧 {{cite web}}: CS1 メンテナンス: 場所 (リンク)
  7. ^ "文字列リテラル" . en.cppreference.com . 2019年12月23日閲覧
  8. ^ "stddef.h - 標準型定義​​" . The Open Group . 2017年1月28日閲覧
  9. ^ リチャード・ギラム(2003年)『Unicodeの謎を解き明かす:プログラマのための実践的エンコーディング標準ガイド』Addison-Wesley Professional. p. 714. ISBN 9780201700527.
  10. ^ 「C++ - 一般的なプログラミングにおけるwchar_tの用途は何ですか?」 Stack Overflow2022年8月1日閲覧
  11. ^ "char, wchar_t, char8_t, char16_t, char32_t" . docs.microsoft.com . 2022年8月1日閲覧
  12. ^ "char8_t" .
  13. ^ a b "<cuchar> (uchar.h)" .
  14. ^ "char16_t" .
  15. ^ a b 「テキストマクロの置き換え」
  16. ^ a b 「基本型」
  17. ^ "char32_t" .
  18. ^ a b "strcpy - cppreference.com" . En.cppreference.com. 2014年1月2日. 2014年3月6日閲覧
  19. ^ "wcscpy - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  20. ^ "strncpy - cppreference.com" . En.cppreference.com. 2013年10月4日. 2014年3月6日閲覧
  21. ^ "wcsncpy - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  22. ^ a b "strcat - cppreference.com" . En.cppreference.com. 2013年10月8日. 2014年3月6日閲覧
  23. ^ "wcscat - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  24. ^ "strncat - cppreference.com" . En.cppreference.com. 2013年7月1日. 2014年3月6日閲覧
  25. ^ "wcsncat - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  26. ^ "strxfrm - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  27. ^ "wcsxfrm - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  28. ^ "strlen - cppreference.com" . En.cppreference.com. 2013年12月27日. 2014年3月6日閲覧
  29. ^ "wcslen - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  30. ^ "strcmp - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  31. ^ "wcscmp - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  32. ^ "strncmp - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  33. ^ "wcsncmp - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  34. ^ "strcoll - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  35. ^ "wcscoll - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  36. ^ "strchr - cppreference.com" . En.cppreference.com. 2014年2月23日. 2014年3月6日閲覧
  37. ^ "wcschr - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  38. ^ "strrchr - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  39. ^ "wcsrchr - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  40. ^ "strspn - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  41. ^ "wcsspn - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  42. ^ "strcspn - cppreference.com" . En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
  43. ^ "wcscspn - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  44. ^ "strpbrk - cppreference.com" . En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
  45. ^ "wcspbrk - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  46. ^ "strstr - cppreference.com" . En.cppreference.com. 2013年10月16日. 2014年3月6日閲覧
  47. ^ "wcsstr - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  48. ^ "strtok - cppreference.com" . En.cppreference.com. 2013年9月3日. 2014年3月6日閲覧
  49. ^ "wcstok - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  50. ^ "strerror - cppreference.com" . En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
  51. ^ "memset - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  52. ^ "wmemset - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  53. ^ "memcpy - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  54. ^ "wmemcpy - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  55. ^ "memmove - cppreference.com" . En.cppreference.com. 2014年1月25日. 2014年3月6日閲覧
  56. ^ "wmemmove - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  57. ^ "memcmp - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  58. ^ "wmemcmp - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  59. ^ "memchr - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  60. ^ "wmemchr - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  61. ^ "mblen - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  62. ^ "mbtowc - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  63. ^ "wctomb - cppreference.com" . En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
  64. ^ "mbstowcs - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  65. ^ "wcstombs - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  66. ^ "btowc - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  67. ^ "wctob - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  68. ^ "mbsinit - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  69. ^ "mbrlen - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  70. ^ "mbrtowc - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  71. ^ "wcrtomb - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  72. ^ "mbsrtowcs - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  73. ^ "wcsrtombs - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  74. ^ "mbrtoc8 - cppreference.com" . En.cppreference.com。
  75. ^ "c8rtomb - cppreference.com" . En.cppreference.com.
  76. ^ "mbrtoc16 - cppreference.com" . En.cppreference.com.
  77. ^ "c16rtomb - cppreference.com" . En.cppreference.com。
  78. ^ "mbrtoc32 - cppreference.com" . En.cppreference.com.
  79. ^ "c23rtomb - cppreference.com" . En.cppreference.com。
  80. ^ 「6.3.2 変換状態の表現」 . GNU Cライブラリ. 2017年1月31日閲覧
  81. ^ "root/src/multibyte/c16rtomb.c" . 2017年1月31日閲覧
  82. ^ "/stable/11/lib/libc/locale/c16rtomb.c の内容" . 2017年1月31日閲覧
  83. ^ "atof - cppreference.com" . En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
  84. ^ "アトイ、環礁、環礁 - cppreference.com" . En.cppreference.com。 2014 年 1 月 18 日2014 年3 月 6 日に取得
  85. ^ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
  86. ^ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
  87. ^ "strtof, strtod, strtold - cppreference.com" . En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
  88. ^ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  89. ^ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  90. ^ "wcstof, wcstod, wcstold - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  91. ^ "strtol, strtoll - cppreference.com" . En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
  92. ^ "wcstol, wcstoll - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  93. ^ "strtoul, strtoull - cppreference.com" . En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
  94. ^ "wcstoul, wcstoull - cppreference.com" . En.cppreference.com . 2014年3月6日閲覧
  95. ^ 「WG14-N3020:修飾子を保持する標準ライブラリ関数、v4」(PDF) . open-std.org . 2022年6月13日.
  96. ^ C99 根拠、7.20.1.1
  97. ^ "bzero(3)" . OpenBSD . 2017年11月27日閲覧
  98. ^ "memccpy" . Pubs.opengroup.org . 2014年3月6日閲覧
  99. ^ "mempcpy(3) - Linuxマニュアルページ" . Kernel.org . 2014年3月6日閲覧
  100. ^ "strcasecmp(3) - Linuxマニュアルページ" . Kernel.org . 2014年3月6日閲覧
  101. ^ "strcat_s、wcscat_s、_mbscat_s" . docs.microsoft.com . 2022年4月22日閲覧
  102. ^ "strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l" . docs.microsoft.com . 2025年12月9日閲覧
  103. ^ "strcpy_s、wcscpy_s、_mbscpy_s、_mbscpy_s_l" . docs.microsoft.com . 2022年4月22日閲覧
  104. ^ "strncpy_s、_strncpy_s_l、wcsncpy_s、_wcsncpy_s_l、_mbsncpy_s、_mbsncpy_s_l、_tcsncpy_s、_tcsncpy_s_l、_tcsnccpy_s、_tcsnccpy_s_l" . docs.microsoft.com . 2025年12月9日閲覧
  105. ^ "strdup" . Pubs.opengroup.org . 2014年3月6日閲覧
  106. ^ "strerror(3) - Linuxマニュアルページ" . man7.org . 2019年11月3日閲覧
  107. ^ a b 「strlcpy、strlcat — サイズ制限のある文字列のコピーと連結」 OpenBSD . 2016年5月26日閲覧
  108. ^ a b c d Todd C. Miller; Theo de Raadt (1999). 「strlcpyとstrlcat – 一貫性があり安全な文字列のコピーと連結」 USENIX '99.
  109. ^ "strsignal" . Pubs.opengroup.org . 2014年3月6日閲覧
  110. ^ "ストラトーク" . Pubs.opengroup.org 2014 年3 月 6 日に取得
  111. ^ Todd C. Miller. 「strlcpy.c」 . BSD相互参照.
  112. ^ Todd C. Miller. 「strlcat.c」 . BSD相互参照.
  113. ^ Miller, Damien (2005年10月). 「セキュアな移植性」(PDF) . 2016年6月26日閲覧.この[strlcpyとstrlcat] APIは、ほとんどの最新のオペレーティングシステムと多くのスタンドアロンソフトウェアパッケージに採用されています[...]。注目すべき例外はGNU標準Cライブラリであるglibcです。glibcのメンテナは、これらの改良されたAPIが、ほとんどの場合、置き換えるAPIよりも高速であるという事前の証拠があるにもかかわらず、これらのAPIを「ひどく非効率なBSDのガラクタ」と呼び、頑なに組み入れることを拒否しています。
  114. ^ libc-alpha メーリングリスト Archived 9 June 2007 at the Wayback Machine、2000年8月8日のスレッドから選択されたメッセージ: 53 60 61
  115. ^ strlcpy() の長所と短所; LWN.net
  116. ^ 「glibcにstrlcpy()を追加する」 lwn.net正しい文字列処理とは、文字列の長さを常に把握し、strcpyの代わりにmemcpyを使用できることを意味します。
  117. ^ strlcpy(3)  –  Linuxライブラリ関数マニュアル(ManKier.comより)「しかし、このような最適化はstrlcpy()とstrlcat()の本来の目的を損なわせるため、その妥当性には疑問が残るかもしれません。実際、このマニュアルページの最初のバージョンでは誤りがありました。」
  118. ^ "libbsd" . 2022年11月21日閲覧
  119. ^ "root/src/string/strlcpy.c" . 2017年1月28日閲覧
  120. ^ "root/src/string/strlcat.c" . 2017年1月28日閲覧
  121. ^ strlc{py|at} コミット
  122. ^ Hacker News における glibc 2.38 の strlcpy と strlcat に関する議論
  123. ^ "strlcat" . Pubs.opengroup.org . 2024年9月5日閲覧
  124. ^ Lovell, Martyn. 「Visual Studio 2005の安全なCおよびC++ライブラリでコードへの攻撃を撃退」 . 2015年2月13日閲覧
  125. ^ Safe Cライブラリ。「Safe Cライブラリは、ISO/IEC TR24731に準拠した境界チェックメモリと文字列関数を提供します。」Sourceforge 。 2013年3月6日閲覧
  126. ^ 「C11標準草案」(PDF) §K.3.1.4p2 。 2013年2月13日閲覧 {{cite web}}: CS1 メンテナンス: 場所 (リンク)
  127. ^ 「C11標準草案」(PDF) §K.3.6.1.1p4 。 2013年2月13日閲覧 {{cite web}}: CS1 メンテナンス: 場所 (リンク)
  128. ^ 「パラメータ検証」。2022年10月21日。
  129. ^ ダニー・カレフ. 「彼らはまたやっている」 . InformIT. 2012年1月15日時点のオリジナルよりアーカイブ。 2011年11月10日閲覧
  130. ^ 「附属書Kの境界チェックインターフェースに関する現場経験」 。 2015年11月5日閲覧
  131. ^ 「MSC06-C. コンパイラの最適化に注意」 SEI CERT Cコーディング標準
  132. ^ memset_s(3)  –  FreeBSDライブラリ関数マニュアル
[編集]
  • C 言語の高速 memcpy、さまざまな種類の CPU 命令アーキテクチャをターゲットとする複数の C コーディング例

    Cプログラミング言語には、標準ライブラリに文字列(文字列とバイト文字列)に対する操作を実装する一連の関数があります。コピー、連結トークン化、検索など、さまざまな操作がサポートされています。文字列の場合、標準ライブラリは文字列をNULLで終了するという規則を使用します。つまり、 n文字の文字列はn + 1個の要素の配列として表現され、最後の要素は数値0の 「 NUL文字」です

    プログラミング言語自体における文字列の唯一のサポートは、コンパイラが引用符で囲まれた文字列定数をnull で終わる文字列に変換することです。

    定義

    文字列は、最初のゼロコード単位(NULコード単位と呼ばれることが多い)で終了する連続したコード単位の列として定義されます。 [1]これは、最初のゼロコード単位が文字列の終わりを示すため、文字列にゼロコード単位を含めることができないことを意味します。文字列の長さは、ゼロコード単位の前のコード単位の数です。[1]文字列が占有するメモリは、ゼロ終端文字を格納するためのスペースが必要であるため、常に長さよりも1コード単位多くなります。

    一般的に、「文字列」という用語は、コード単位が 型の文字列を指しますchar。これは、すべての現代のマシンでは正確に8ビットです。C90では、型のコード単位を使用するワイド文字列[1]が定義されていますwchar_t。これは現代のマシンでは16ビットまたは32ビットです。これはUnicodeを対象としていましたが、Unicodeの通常の文字列ではUTF-8を使用するのがますます一般的になっています

    文字列は、最初のコードユニットへのポインタを渡すことで関数に渡されます。char*と はwchar_t*異なる型であるため、ワイド文字列を処理する関数は通常の文字列を処理する関数とは異なり、異なる名前を持ちます。

    文字列リテラル"text"Cソースコード内)は、コンパイル時に配列(char[]Cまたはconst char[]C++)に変換されます。[2]結果は、すべての文字と末尾のゼロコード単位を含むコード単位の配列です。C90ではL"text"ワイド文字列が生成されます。文字列リテラルにはゼロコード単位を含めることができます(1つの方法はソースコード内に格納することです\0)が、その場合、文字列はその時点で終了してしまいます。リテラルの残りの部分はメモリに配置されます(末尾に別のゼロコード単位が追加されます)。しかし、これらのコード単位が文字列リテラルから変換されたかどうかを知ることは不可能であるため、そのようなソースコードは文字列リテラルではありません[3]

    文字エンコーディング

    char各文字列は、適切な種類のゼロ コード単位 (または)の最初の出現で終了しますwchar_t。したがって、バイト文字列 ( char*)には、 ASCIIまたは任意のASCII 拡張の非NUL文字を含めることができますが、 UTF-16などのエンコードの文字を含めることはできません(16 ビット コード単位がゼロでなくても、上位バイトまたは下位バイトがゼロになることがあります)。ワイド文字列に格納できるエンコードは の幅によって定義されます。ほとんどの実装では、は少なくとも 16 ビットであるため、UCS-2などのすべての 16 ビットエンコードを格納できます。 が32 ビットの場合、UTF-32などの 32 ビットエンコードを格納できます。(標準では「任意のワイド文字を保持できる型」が必要ですが、Windows では UCS-2 から UTF-16 への移行以降は当てはまりません。これは標準の欠陥として認識され、C++ で修正されました。) [ 4 ] C++11C11 [5]wchar_twchar_twchar_tchar16_tchar32_t

    可変幅エンコーディングは、バイト文字列とワイド文字列の両方で使用できます。文字列の長さとオフセットはwchar_t「文字数」ではなくバイト数またはバイト単位で測定されるため、初心者プログラマーにとっては混乱を招く可能性があります。UTF -8Shift JISはC言語のバイト文字列でよく使用され、UTF-16は16ビットのC言語のワイド文字列でよく使用されますwchar_t。可変幅文字を含む文字列を関数などの関数で切り捨てると、strncpy文字列の末尾に無効なシーケンスが生成されることがあります。切り捨てられた部分が、入力が有効であると想定するコードによって解釈される場合、これは安全ではない可能性があります。

    (UTF-8) や(UTF-16 または UTF-32、 に依存)などの Unicode リテラルのサポートは実装定義であり、 [6]ソースコードが同じエンコーディングであることが要求される場合があります。特にコンパイラが引用符で囲まれた内容をコピーしてしまうような場合にはそうです。コンパイラやエディタによっては、UTF-8 の各バイトやUTF-16 の各ワードごとに、すべての非 ASCII 文字をシーケンスとして入力する必要があります。C11 (および C++11) 以降では、 のように、バイト文字列リテラルに対して UTF-8 を保証する新しいリテラル プレフィックスが利用できます[7] C++20およびC23以降ではUTF-8 文字を格納するための型が追加され、u8 プレフィックス付きの文字リテラルと文字列リテラルの型はそれぞれ と に変更されましchar foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNu8char foo[512] = u8"φωωβαρ";char8_tchar8_tchar8_t[]

    機能

    用語

    歴史的なドキュメントでは、Cの文字列に対して「バイト」ではなく「文字」という用語がよく使われていました。そのため、多くの人誰?)は、これらの関数がUTF-8では動作しないと信じています。実際には、すべての長さはバイト単位で定義されており、これはすべての実装に当てはまり、これらの関数はUTF-8でもシングルバイトエンコーディングと同様に動作します。BSDのドキュメントはこれを明確にするために修正されましたが、POSIX、Linux、およびWindowsのドキュメントでは、多くの箇所で「バイト」または「wchar_t」が正しい用語であるにもかかわらず、依然として「文字」が使用されています

    メモリバッファを処理する関数は、データの一部としてヌルバイトを含むバイトシーケンスを処理できます。これらの関数の名前は通常、接頭辞memの反対である ,で始まりますstr

    ヘッダー

    Cの文字列を操作する関数のほとんどはstring.hヘッダー(cstringC++の場合)で宣言されていますが、Cのワイド文字列を操作する関数はwchar.hヘッダー(cwcharC++の場合)で宣言されています。これらのヘッダーには、メモリバッファの処理に使用される関数の宣言も含まれているため、この名前は少し誤解を招く可能性があります

    で宣言された関数は、 C標準ライブラリstring.hの一部として、Cをサポートするあらゆるプラットフォームで動作することが保証されているため、非常に人気があります。しかし、これらの関数には、注意深く適切に使用しないとバッファオーバーフローが発生する可能性があるなど、セキュリティ上の問題がいくつか存在します。そのため、プログラマーはより安全で、かつ移植性が低い可能性のある関数を好みます。以下に、その中で人気のある関数をいくつか挙げます。これらの関数の中には、文字列ポインタを受け入れ、文字列内で非ポインタを返すことで、 constの正確性に違反するものもあります。これを修正するために、 C++版の標準ライブラリでは、 一部の関数が2つのオーバーロード関数に分割されています。constconst

    定数と型

    名前注釈
    NULLヌルポインタ定数に展開されるマクロ。つまり、メモリ内のオブジェクトの有効なアドレスではないことが保証されたポインタ値を表す定数です
    wchar_t「ワイド」文字列のコード単位として使用される型。C標準では、wchar_tはサポートされているシステムロケール[8]の中で最も広い文字セットを格納できる幅を持ち、 char [9]以上のサイズを持つことが求められています。wchar_t広く使用する唯一のプラットフォームであるWindowsでは、16ビット[10]として定義されています。これはかつてはあらゆるUnicodeUCS-2 )文字を表すのに十分でしたが、現在はUTF-16コード単位(コードポイントの半分)を表すのにしか十分ではありません。他のプラットフォームでは32ビットとして定義されており、Unicodeコードポイントは常に1つに収まります。この違いにより、wchar_tを使用するコードは移植性がありません。
    wint_twchar_tの任意の値とマクロWEOFの値を保持できる整数型。通常は32ビットの符号付き値です
    char8_t [11]C23以降のC標準の一部で、<uchar.h>に格納されている。UTF-8文字を格納するのに適した型。[12]
    char16_t [13]C11以降C標準の一部であり[14] <uchar.h>で定義されている、 wchar_tが別のサイズの場合でも16ビットを保持できる型。マクロが1と定義されている場合、そのシステムではUTF-16として使用されます。これはC23では常に当てはまります。[15] C++ではこのようなマクロは定義されていませんが、その言語では常にUTF-16として使用されます。[16]__STDC_UTF_16__
    char32_t [13]C11以降C標準の一部であり、[17] <uchar.h>で定義されている、 wchar_tが別のサイズの場合でも32ビットを保持できる型。マクロが1として定義されている場合、そのシステムではUTF-32として使用されます。これはC23では常に当てはまります。[15] C++ではこのようなマクロは定義されていませんが、その言語では常にUTF-32として使用されます。[16]__STDC_UTF_32__
    mbstate_tある関数の呼び出しから別の関数の呼び出しに必要な変換状態に関するすべての情報が含まれています

    関数

    バイト
    文字列
    幅広
    ひも
    説明[注 1]
    文字列
    操作
    strcpy [18]wcscpy [19]ある文字列を別の文字列にコピーします
    strncpy [20]wcsncpy [21]ソースからコピーするかヌルを追加して、正確にnバイトを書き込みます。
    strcat [22]wcscat [23]一つの文字列を別の文字列に追加する
    strncat [24]wcsncat [25]ある文字列から別の文字列にnバイト以内を追加します
    strxfrm [26]wcsxfrm [27]現在のロケールに従って文字列を変換します
    文字列の
    検査
    strlen [28]wcslen [29]文字列の長さを返します
    strcmp [30]wcscmp [31]2つの文字列を比較します(3者間比較
    strncmp [32]wcsncmp [33]2つの文字列の特定のバイト数を比較します
    strcoll [34]wcscoll [35]現在のロケールに従って2つの文字列を比較します
    strchr [36]wcschr [37]文字列内のバイトの最初の出現を検索します
    strrchr [38]wcsrchr [39]文字列内のバイトの最後の出現箇所を検索します
    strspn [40]wcsspn [41]文字列の最初のバイト数のうち、2番目の文字列に含まれるバイト数を返します。
    strcspn [42]wcscspn [43]文字列の最初のバイト数のうち、2番目の文字列に含まれないバイト数を返します。
    strpbrk [44]wcspbrk [45]文字列内でセット内のバイトの最初の出現を検索します
    strstr [46]wcsstr [47]文字列内の部分文字列の最初の出現を検索します
    strtok [48]wcstok [49]文字列をトークンに分割します
    その他ストレラ[50]該当なしエラーコードから派生したメッセージを含む文字列を返します
    メモリ
    操作
    memset [51]wmemset [52]バッファを繰り返しバイトで埋めます。C23以降機密データを消去するためにmemset_explicit()が追加されました。
    memcpy [53]wmemcpy [54]あるバッファを別のバッファにコピーします。C23以降文字列を効率的に連結するためにmemccpy()が追加されました。
    memmove [55]wmemmove [56]1つのバッファを別のバッファ(重複する可能性がある)にコピーします
    memcmp [57]wmemcmp [58]2つのバッファを比較する(3者間比較)
    memchr [59]wmemchr [60]バッファ内のバイトの最初の出現を検索します
    1. ^ ワイド文字列関数については、説明中の「byte」をwchar_tに置き換えてください。

    マルチバイト関数

    名前説明
    mblen [61]次のマルチバイト文字のバイト数を返します
    mbtowc [62]次のマルチバイト文字をワイド文字に変換します
    wctomb [63]ワイド文字をマルチバイト表現に変換します
    mbstowcs [64]マルチバイト文字列をワイド文字列に変換します
    wcstombs [65]ワイド文字列をマルチバイト文字列に変換します
    btowc [66]可能であれば、シングルバイト文字をワイド文字に変換します。
    wctob [67]可能であれば、ワイド文字をシングルバイト文字に変換します。
    mbsinit [68]状態オブジェクトが初期状態を表しているかどうかを確認します
    mbrlen [69]指定された状態で次のマルチバイト文字のバイト数を返します。
    mbrtowc [70]指定された状態に従って、次のマルチバイト文字をワイド文字に変換します。
    wcrtomb [71]与えられた状態に基づいて、ワイド文字をマルチバイト表現に変換します。
    mbsrtowcs [72]指定された状態に基づいて、マルチバイト文字列をワイド文字列に変換します。
    wcsrtombs [73]指定された状態に基づいてワイド文字列をマルチバイト文字列に変換します。
    mbrtoc8 [74]指定された状態に従って、次のマルチバイト文字を UTF-8 文字に変換します。
    c8rtomb [75]指定された状態に基づいて、単一のコードポイントをUTF-8からナローマルチバイト文字表現に変換します。
    mbrtoc16 [76]指定された状態に従って、次のマルチバイト文字を UTF-16 文字に変換します。
    c16rtomb [77]指定された状態に基づいて、単一のコードポイントをUTF-16からナローマルチバイト文字表現に変換します。
    mbrtoc32 [78]指定された状態に従って、次のマルチバイト文字を UTF-32 文字に変換します。
    c32rtomb [79]指定された状態に基づいて、UTF-32 から狭いマルチバイト文字表現に単一のコードポイントを変換します。

    これらの機能はすべてmbstate_tオブジェクト。元々は静的メモリに格納されていたため、関数はスレッドセーフではありませんでした。後から追加されたオブジェクトでは、呼び出し側が管理する必要がありました。これは元々、関数のシフト状態を追跡することを目的としていましたmbエンコーディングにはUTF-8などの最新のエンコーディングは必要ありません。ただし、これらの関数は、wcエンコードは可変幅エンコードではないため、正確に1つの文字を処理するように設計されていますwchar_t一度に1つずつ、文字列ポインタではなく値で渡します。UTF-16は可変幅エンコーディングであるため、mbstate_tワイドエンコーディングのサロゲートペアを追跡するために再利用されているが、呼び出し側は依然として検出して呼び出す必要がある。mbtowc1文字につき2回。[80] [81] [82]標準へのその後の追加では、プログラマーが関心を持つ唯一の変換はUTF-8とUTF-16の間であることが認められ、直接提供されています

    数値変換

    バイト
    文字列
    幅広
    ひも
    説明[注 1]
    atof [83]該当なし文字列を浮動小数点値に変換します(「atof」は「ASCIIから浮動小数点」を意味します)
    アトイ環礁[ 84 ]

    該当なし文字列を整数に変換します(C99)(「atoi」は「ASCIIから整数」を意味します)
    strtof ( C99 ) [85] strtod [86] strtold ( C99 ) [87]

    wcstof ( C99 ) [88] wcstod [89] wcstold ( C99 ) [90]

    文字列を浮動小数点値に変換する
    ストルトルストルトル[91]
    トイレットルトイレットル[92]
    文字列を符号付き整数に変換する
    strtoul strtoul [93]
    ウォクストゥールウォクストゥール[94]
    文字列を符号なし整数に変換する
    1. ^ ここで文字列はバイト文字列またはワイド文字列のいずれかを指します

    C標準ライブラリには、数値変換のための関数がいくつか含まれています。バイト文字列を扱う関数はstdlib.hヘッダー(cstdlibC++では header )で定義されています。ワイド文字列を扱う関数はwchar.hヘッダー(cwcharC++では header )で定義されています。

    関数strchrbsearch、 、strpbrkstrrchr、 、strstr、およびそれらのワイド対応関数は、文字列ポインタを受け取り、文字列内で非ポインタを返すため、 const 正しくmemchrありません。これはC23で修正されました。[95]constconst

    また、規範修正第1版(C95)以降、atoxx関数は関数に包含されると考えられておりstrtoxxx、そのためC95もそれ以降の標準もこれらの関数のワイド文字版を提供していない。これに対する反論は、atoxxエラーとを区別していないというものである0[96]

    BSDSVIDPOSIXなど、いくつかの関連標準では、標準Cが提供する文字列処理機能が拡張されています。こうした関数の一部は、最近のC標準( C11C23など)にも追加されています

    名前出典説明
    bzero [97]4.2BSD、POSIX.1-2001バッファをゼロにします。memsetにより非推奨となり POSIX.1-2008で削除されました
    memccpy [98]4.4BSD、SVID4、POSIX.1-2001、C23重複しない 2 つのバッファ間でコピーし、指定されたバイトが見つかったら停止します。
    mempcpy [99]GNU重複しない2つのバッファ間でコピーを行い、最後に書き込まれたバイトの次のバイトへのポインタを返します
    strcasecmpstrncasecmp [100]4.4BSD、POSIX.1-2001それぞれstrcmpstrncmpの大文字と小文字を区別しないバージョン
    strcat_s , [101] strncat_s [102]Windows、C11それぞれ strcatとstrncatの境界チェックバージョンです
    strcpy_s , [103] strncpy_s [104]Windows、C11それぞれ strcpy とstrncpyの境界チェックバージョンです
    strdupstrndup [105]POSIX.1-2001, C23メモリを割り当て、そこに文字列を複製します。
    strerror_r [106]POSIX.1-2001、GNUstrerrorのスレッドセーフ版。GNU版はPOSIX版と互換性がありません
    strlcpy [107]POSIX.1-2024strcpyの派生関数で、結果を切り捨てて出力バッファに収まるようにします。[108]
    strlcat [107]POSIX.1-2024strcatの派生関数で、結果を切り捨てて出力バッファに収まるようにします。[108]
    strsignal [109]SVID3、POSIX.1-2008シグナルコードの文字列表現を返します
    strtok_r [110]POSIX.1-1996strtokのスレッドセーフ版

    strlcpy、strlcat

    [22][18]をバッファオーバーフローを許さない関数に置き換える必要性が確立されているにもかかわらず、受け入れられた標準は確立されていません。これは、多くのCプログラマが、とが望ましい動作をするだろうと誤って信じていることに一部起因しています。しかし、どちらの関数もそのために設計されたものではありません(これらは、現代のソフトウェアではあまり一般的に使用されていないデータ形式である、ヌルで埋められた固定サイズの文字列バッファを操作することを目的としていました)。また、動作と引数は直感的ではなく、熟練したプログラマでさえも誤って記述されることがよくあります。[108]strcatstrcpystrncatstrncpy

    最も人気のある[a]の代替はstrlcat[111]strlcpy[112]の関数で、1998 年 12 月にOpenBSD 2.4 で登場しました。 [108]これらの関数は常に 1 つの NUL を宛先バッファに書き込み、必要に応じて結果を切り捨て、必要なバッファのサイズを返します。これにより、切り捨てを検出し、切り捨てられない新しいバッファを作成するためのサイズが提供されます。長い間、これらの関数は(Linux 上のソフトウェアで使用されている) GNU C ライブラリには含まれていませんでした。その理由は、効率が悪いという理由、[113] C 文字列 (より優れた代替形式の文字列の代わりに) の使用を推奨する、[114] [115]その他の潜在的なエラーを隠蔽する可能性があるためです。[116] [117] glibcがサポートを追加していなかった間も、strlcatとstrlcpyはOpenBSD、FreeBSDNetBSDSolarisOS XQNXなどの多くのCライブラリ、および2008年に導入されたlibbsd [118]2011年に導入されたmusl [119] [120]などのLinux用の代替Cライブラリに実装されており、ソースコードはSDLGLibffmpegrsyncなどの他のプロジェクトに直接追加され、 Linuxカーネル内部にも追加されました。これは2024年に変更されましたが、glibcのFAQではglibc 2.38の時点でコードがコミットされ[121]追加されたと述べています。[122]これらの関数はPOSIX.1-2024の一部として標準化されました。[123] Austin Group Defect Tracker ID 986は、POSIXのそのような計画に関するいくつかの議論を追跡しました。

    マイクロソフトは2004年のセキュリティ開発ライフサイクルの一環として、strcpy_sおよびstrcat_s(その他多数の関数とともに)を含む「セキュア」関数群を導入しました。 [124]これらの関数は、ISO/IEC WDTR 24731で提案されたオプションのC11(附属書K)の一部として、若干の変更を加えて標準化されました。 [125]これらの関数は、文字列がバッファに収まらないほど長すぎないかどうかなど、様々なチェックを行います。チェックに失敗した場合、ユーザーが指定した「ランタイム制約ハンドラ」関数が呼び出され、[126]通常はプログラムを中止します。[127] [128]これらの関数は、当初Windowsのみに実装されていたこと、そしてMicrosoft Visual C++で標準関数ではなくこれらの関数の使用を推奨する警告メッセージが表示されるようになったことから、かなりの批判を浴びました。これは、マイクロソフトが開発者を自社プラットフォームに閉じ込めようとする試みではないかと推測する声もあります。[129]これらの関数の使用経験から、その採用と使用上の誤りに重大な問題があることが示されたため、C標準の次期改訂版では附属書Kを削除することが提案されました。[130]コンパイラによる不要な最適化を回避する方法としての使用がmemset_s提案されています。[131] [132]

    参照

    1. GitHubでは、 の使用回数は7,813,206回であるのstrlcpyに対し、 の使用回数は38,644回strcpy_s( の使用回数は15,286,150回strcpy)です。 [要出典]

    参考文献

    1. ^ abc 「C99標準ドラフト + TC3」(PDF) §7.1.1p1 2011年1月7日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
    2. ^ 「C99標準ドラフト + TC3」(PDF) §6.4.5p7 。 2011年1月7日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
    3. ^ 「C99標準ドラフト + TC3」(PDF) . 6.4.5節脚注66. 2011年1月7日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
    4. ^ 「既存の慣行に合わせて wchar_t の要件を緩和する」(PDF)
    5. ^ 「基本型」. en.cppreference.com .
    6. ^ 「C99標準草案 + TC3」(PDF) §5.1.1.2翻訳フェーズ、p1 。 2011年12月23日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
    7. ^ "文字列リテラル". en.cppreference.com . 2019年12月23日閲覧
    8. ^ "stddef.h - 標準型定義​​". The Open Group . 2017年1月28日閲覧
    9. ^ リチャード・ギラム(2003年)『Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard』Addison-Wesley Professional. p. 714. ISBN 9780201700527.
    10. ^ 「C++ - 一般的なプログラミングにおけるwchar_tの用途は何ですか?」Stack Overflow2022年8月1日閲覧
    11. ^ “char, wchar_t, char8_t, char16_t, char32_t”. docs.microsoft.com . 2022年8月1日閲覧
    12. ^ "char8_t".
    13. ^ ab "<cuchar> (uchar.h)".
    14. ^ "char16_t".
    15. ^ ab "テキストマクロの置き換え".
    16. ^ ab 「基本型」.
    17. ^ "char32_t".
    18. ^ ab "strcpy - cppreference.com". En.cppreference.com. 2014年1月2日. 2014年3月6日閲覧
    19. ^ "wcscpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    20. ^ "strncpy - cppreference.com". En.cppreference.com. 2013年10月4日. 2014年3月6日閲覧
    21. ^ "wcsncpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    22. ^ ab "strcat - cppreference.com". En.cppreference.com. 2013年10月8日. 2014年3月6日閲覧
    23. ^ "wcscat - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    24. ^ "strncat - cppreference.com". En.cppreference.com. 2013年7月1日. 2014年3月6日閲覧
    25. ^ "wcsncat - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    26. ^ "strxfrm - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    27. ^ "wcsxfrm - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    28. ^ "strlen - cppreference.com". En.cppreference.com. 2013年12月27日. 2014年3月6日閲覧
    29. ^ "wcslen - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    30. ^ "strcmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    31. ^ "wcscmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    32. ^ "strncmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    33. ^ "wcsncmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    34. ^ "strcoll - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    35. ^ "wcscoll - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    36. ^ "strchr - cppreference.com". En.cppreference.com. 2014年2月23日. 2014年3月6日閲覧
    37. ^ "wcschr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    38. ^ "strrchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    39. ^ "wcsrchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    40. ^ "strspn - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    41. ^ "wcsspn - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    42. ^ "strcspn - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
    43. ^ "wcscspn - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    44. ^ "strpbrk - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
    45. ^ "wcspbrk - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    46. ^ "strstr - cppreference.com". En.cppreference.com. 2013年10月16日. 2014年3月6日閲覧
    47. ^ "wcsstr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    48. ^ "strtok - cppreference.com". En.cppreference.com. 2013年9月3日. 2014年3月6日閲覧
    49. ^ "wcstok - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    50. ^ "strerror - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
    51. ^ "memset - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    52. ^ "wmemset - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    53. ^ "memcpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    54. ^ "wmemcpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    55. ^ "memmove - cppreference.com". En.cppreference.com. 2014年1月25日. 2014年3月6日閲覧
    56. ^ "wmemmove - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    57. ^ "memcmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    58. ^ "wmemcmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    59. ^ "memchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    60. ^ "wmemchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    61. ^ "mblen - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    62. ^ "mbtowc - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    63. ^ "wctomb - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
    64. ^ "mbstowcs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    65. ^ "wcstombs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    66. ^ "btowc - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    67. ^ "wctob - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    68. ^ "mbsinit - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    69. ^ "mbrlen - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    70. ^ "mbrtowc - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    71. ^ "wcrtomb - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    72. ^ "mbsrtowcs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    73. ^ "wcsrtombs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    74. ^ "mbrtoc8 - cppreference.com". En.cppreference.com。
    75. ^ "c8rtomb - cppreference.com". En.cppreference.com.
    76. ^ "mbrtoc16 - cppreference.com". En.cppreference.com.
    77. ^ "c16rtomb - cppreference.com". En.cppreference.com。
    78. ^ "mbrtoc32 - cppreference.com". En.cppreference.com.
    79. ^ "c23rtomb - cppreference.com". En.cppreference.com。
    80. ^ “6.3.2 変換状態の表現”. GNU Cライブラリ. 2017年1月31日閲覧
    81. ^ "root/src/multibyte/c16rtomb.c" . 2017年1月31日閲覧
    82. ^ "/stable/11/lib/libc/locale/c16rtomb.c の内容" . 2017年1月31日閲覧
    83. ^ "atof - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧
    84. ^ "アトイ、環礁、環礁 - cppreference.com". En.cppreference.com。 2014 年 1 月 18 日2014 年3 月 6 日に取得
    85. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
    86. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
    87. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
    88. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    89. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    90. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    91. ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
    92. ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    93. ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧
    94. ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com . 2014年3月6日閲覧
    95. ^ 「WG14-N3020:修飾子を保持する標準ライブラリ関数、v4」(PDF) . open-std.org . 2022年6月13日.
    96. ^ C99 根拠、7.20.1.1
    97. ^ "bzero(3)". OpenBSD . 2017年11月27日閲覧
    98. ^ "memccpy". Pubs.opengroup.org . 2014年3月6日閲覧
    99. ^ "mempcpy(3) - Linuxマニュアルページ". Kernel.org . 2014年3月6日閲覧
    100. ^ "strcasecmp(3) - Linuxマニュアルページ". Kernel.org . 2014年3月6日閲覧
    101. ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com . 2022年4月22日閲覧
    102. ^ “strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l”. docs.microsoft.com . 2025年12月9日閲覧
    103. ^ “strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l”. docs.microsoft.com . 2022年4月22日閲覧
    104. ^ “strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l, _tcsncpy_s, _tcsncpy_s_l, _tcsnccpy_s, _tcsnccpy_s_l”. docs.microsoft.com . 2025年12月9日閲覧
    105. ^ "strdup". Pubs.opengroup.org . 2014年3月6日閲覧
    106. ^ "strerror(3) - Linuxマニュアルページ". man7.org . 2019年11月3日閲覧
    107. ^ ab "strlcpy, strlcat — サイズ制限のある文字列のコピーと連結". OpenBSD . 2016年5月26日閲覧
    108. ^ abcd Todd C. Miller; Theo de Raadt (1999). 「strlcpy と strlcat – 一貫性があり安全な文字列のコピーと連結」USENIX '99.
    109. ^ "strsignal". Pubs.opengroup.org . 2014年3月6日閲覧
    110. ^ 「ストラトーク」。 Pubs.opengroup.org 2014 年3 月 6 日に取得
    111. ^ Todd C. Miller. "strlcpy.c". BSD相互参照.
    112. ^ Todd C. Miller. "strlcat.c". BSD相互参照.
    113. ^ Miller, Damien (2005年10月). 「セキュアな移植性」(PDF) . 2016年6月26日閲覧.この[strlcpyとstrlcat] APIは、ほとんどの最新のオペレーティングシステムと多くのスタンドアロンソフトウェアパッケージに採用されています[...]。注目すべき例外はGNU標準Cライブラリであるglibcです。glibcのメンテナは、これらの改良されたAPIが、ほとんどの場合、置き換えるAPIよりも高速であるという事前の証拠があるにもかかわらず、これらのAPIを「ひどく非効率なBSDのガラクタ」と呼び、頑なに組み入れることを拒否しています。
    114. ^ libc-alpha メーリングリスト Archived 9 June 2007 at the Wayback Machine、2000年8月8日のスレッドから選択されたメッセージ: 53, 60, 61
    115. ^ strlcpy() の長所と短所; LWN.net
    116. ^ 「glibcにstrlcpy()を追加する」lwn.net正しい文字列処理とは、文字列の長さを常に把握し、strcpyの代わりにmemcpyを使用できることを意味します。
    117. ^ strlcpy(3)  –  Linuxライブラリ関数マニュアル(ManKier.comより)「しかし、このような最適化はstrlcpy()とstrlcat()の本来の目的を損なわせるため、その妥当性には疑問が残るかもしれません。実際、このマニュアルページの最初のバージョンでは誤りがありました。」
    118. ^ "libbsd" . 2022年11月21日閲覧
    119. ^ "root/src/string/strlcpy.c" . 2017年1月28日閲覧
    120. ^ "root/src/string/strlcat.c" . 2017年1月28日閲覧
    121. ^ strlc{py|at} コミット
    122. ^ Hacker News における glibc 2.38 の strlcpy と strlcat に関する議論
    123. ^ "strlcat". Pubs.opengroup.org . 2024年9月5日閲覧
    124. ^ Lovell, Martyn. 「Visual Studio 2005の安全なCおよびC++ライブラリでコードへの攻撃を撃退」 . 2015年2月13日閲覧
    125. ^ Safe Cライブラリ。「Safe Cライブラリは、ISO/IEC TR24731に準拠した境界チェックメモリおよび文字列関数を提供します。」Sourceforge 。 2013年3月6日閲覧
    126. ^ 「C11標準草案」(PDF) §K.3.1.4p2 。 2013年2月13日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
    127. ^ 「C11標準草案」(PDF) §K.3.6.1.1p4 。 2013年2月13日閲覧{{cite web}}: CS1 メンテナンス: 場所 (リンク)
    128. ^ 「パラメータ検証」。2022年10月21日。
    129. ^ ダニー・カレフ. 「彼らはまたやっている」. InformIT. 2012年1月15日時点のオリジナルよりアーカイブ。 2011年11月10日閲覧
    130. ^ 「附属書Kの境界チェックインターフェースに関する現場経験」 。 2015年11月5日閲覧
    131. ^ 「MSC06-C. コンパイラの最適化に注意」SEI CERT Cコーディング標準
    132. ^ memset_s(3)  –  FreeBSDライブラリ関数マニュアル
    • C 言語の高速 memcpy、さまざまな種類の CPU 命令アーキテクチャをターゲットとする複数の C コーディング例
    「https://en.wikipedia.org/w/index.php?title=C_string_handling&oldid=1326490676#memccpy」から取得
    Original text
    Rate this translation
    Your feedback will be used to help improve Google Translate