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 ソース コード内) は、コンパイル中に配列に変換されます。[2]結果は、すべての文字と末尾のゼロのコード単位を含むコード単位の配列です。C90L"text"では、幅の広い文字列が生成されます。文字列リテラルにはゼロ コード ユニットを含めることができますが (1 つの方法は\0ソースに配置することです)、これにより文字列がその時点で終了します。リテラルの残りの部分はメモリに配置されます (別のゼロ コード単位が最後に追加されます) が、それらのコード単位が文字列リテラルから変換されたことを知ることは不可能であるため、そのようなソース コードは文字列リテラルではありません[3]

文字エンコーディング

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

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

(UTF-8) または(UTF-16 または UTF-32、に依存)などの Unicode リテラルのサポートは実装定義であり[5]、特にコンパイラが単に引用符の間にあるものをすべてコピーします。一部のコンパイラまたはエディタでは、UTF-8 の各バイト、および/またはUTF-16 の各単語のシーケンスとして、すべての非 ASCII 文字を入力する必要があります。C11 (および C++11) 以降、バイト文字列リテラルの UTF-8 を保証する新しいリテラル構文が利用可能になりました。[6]char foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNchar foo[512] = u8"φωωβαρ";

機能概要

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

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

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

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

定数と型

名前 ノート
NULL null ポインター定数に展開されるマクロ。つまり、メモリ内のオブジェクトの有効なアドレスでは ないことが保証されているポインター値を表す定数です。
wchar_t ワイド文字列のコード単位に使用される型で、通常は符号なしの 16 ビットまたは 32 ビットの値です。広く使用される唯一のプラットフォームであるWindowswchar_tでは、 16 ビット[7]として定義されており、(当時は) Unicode文字を表すの十分でしたが、現在はUTF-16コード単位を表すのに十分です。半文字ですが、そのような文字はすべて 2 つのサロゲートで表すことができます。現在、Microsoftは、オペレーティング システムの Unicode にUTF-8エンコーディングを使用することを推奨しており、コンパイラ (およびその他) は完全にサポートしています。これらの特定の解釈は指定されていませんwchar_tコード単位; C 標準では、サポートされているシステムロケールの中で最も広い文字セットを保持するのに十分な幅のwchar_tのみが必要です。[8]理論的には、wchar_tはcharと同じサイズにすることができるため、UTF-32またはUTF-16コード単位を保持することはできませんが、 [9] UTF-8コード単位には常に十分ですが、を使用して; また、すべての場合 (16 ビット以下の場合)、最新のUnicode では、可変長コードの使用を強制しますたとえば、Microsoft のVisual Studioで既にサポートされている標準化されたcharchar8_tUTF-8サポートを改善するための Windows コンパイラ。[10]
wint_t wchar_t の任意の値とマクロ WEOF の値を保持できる整数型。このタイプは、統合昇格によって変更されません。通常は 32 ビットの符号付きの値です。
mbstate_t 関数への 1 つの呼び出しから別の関数への呼び出しに必要な変換状態に関するすべての情報が含まれています。

機能

バイト
文字列
ワイド
ストリング
説明[注 1]
文字列
操作
strcpy[11] wcscpy[12] ある文字列を別の文字列にコピーします
strncpy[13] wcsncpy[14] ソースからコピーするか、null を追加して、正確にnバイトを 書き込みます
strcat[15] wcscat[16] ある文字列を別の文字列に追加します
strncat[17] wcsncat[18] ある文字列から別の文字列に nバイト以下を追加します
strxfrm[19] wcsxfrm[20] 現在のロケールに従って文字列を変換します
文字列
検査
strlen[21] wcslen[22] 文字列の長さを返します
strcmp[23] wcscmp[24] 2 つの文字列を比較します (三者間比較)
strncmp[25] wcsncmp[26] 2 つの文字列の特定のバイト数を比較します
strcoll[27] wcscoll[28] 現在のロケールに従って 2 つの文字列を比較します
strchr[29] wcschr[30] 文字列内で最初に出現するバイトを検索します
strrchr[31] wcsrchr[32] 文字列内で最後に出現するバイトを検索します
strspn[33] wcsspn[34] 2 番目の文字列にある文字列の最初のバイト数を返します
strcspn[35] wcscspn[36] 2 番目の文字列にない文字列の最初のバイト数を返します
strpbrk[37] wcspbrk[38] セット内で最初に出現するバイトを文字列内で検索します
strstr[39] wcsstr[40] 文字列内で最初に出現する部分文字列を検索します
strtok[41] wcstok[42] 文字列をトークンに分割します
その他 strerror[43] エラー コードから派生したメッセージを含む文字列を返します
メモリ
操作
memset[44] wmemset[45] 繰り返されるバイトでバッファを埋める
memcpy[46] wmemcpy[47] あるバッファを別のバッファにコピーします
memmove[48] wmemmove[49] 1 つのバッファーを別の (オーバーラップしている可能性がある) バッファーにコピーします。
memcmp[50] wmemcmp[51] 2 つのバッファを比較します (三者間比較)
memchr[52] wmemchr[53] バッファ内で最初に出現するバイトを検索します
  1. ^ ワイド文字列関数wchar_t、説明の「バイト」に

マルチバイト関数

名前 説明
mblen[54] 次のマルチバイト文字のバイト数を返します
mbtowc[55] 次のマルチバイト文字をワイド文字に変換します
wctomb[56] ワイド文字をそのマルチバイト表現に変換します
mbstowcs[57] マルチバイト文字列をワイド文字列に変換します
wcstombs[58] ワイド文字列をマルチバイト文字列に変換します
btowc[59] 可能であれば、シングルバイト文字をワイド文字に変換します
wctob[60] 可能であれば、ワイド文字をシングルバイト文字に変換します
mbsinit[61] 状態オブジェクトが初期状態を表しているかどうかを確認します
mbrlen[62] 指定された状態で、次のマルチバイト文字のバイト数を返します
mbrtowc[63] 指定された状態で、次のマルチバイト文字をワイド文字に変換します
wcrtomb[64] 指定された状態で、ワイド文字をそのマルチバイト表現に変換します
mbsrtowcs[65] 指定された状態で、マルチバイト文字列をワイド文字列に変換します
wcsrtombs[66] 指定された状態で、ワイド文字列をマルチバイト文字列に変換します

これらの関数はすべて、mbstate_t呼び出し元が保持する必要があるオブジェクト。これはもともと、シフトの状態を追跡することを目的としていました。メガバイトエンコーディングですが、UTF-8 などの最新のものはこれを必要としません。ただし、これらの機能は、トイレencoding は可変幅のエンコーディングではないため、正確に 1 つを処理するように設計されています。wchar_t一度に、文字列ポインターを使用するのではなく、値で渡します。UTF-16 は可変幅エンコーディングであるため、mbstate_tワイド エンコーディングでサロゲート ペアを追跡するために再利用されていますが、呼び出し元は引き続き検出して呼び出す必要があります。mbtowc1キャラにつき2回。[67] [68] [69]

数値変換

バイト
文字列
ワイド
ストリング
説明[注 1]
atof[70] 文字列を浮動小数点値に変換します ('atof' は 'ASCII to float' を意味します)
atoi
atol
atoll[71]
文字列を整数に変換します ( C99 ) ('atoi' は 'ASCII から整数' を意味します)
strtof( C99 ) [72]
strtod[73]
strtold ( C99 ) [74]
wcstof( C99 ) [75]
wcstod[76]
wcstold ( C99 ) [77]
文字列を浮動小数点値に変換します
strtol
strtoll[78]
wcstol
wcstoll[79]
文字列を符号付き整数に変換します
strtoul
strtoull[80]
wcstoul
wcstoull[81]
文字列を符号なし整数に変換します
  1. ^ ここで文字列は、バイト文字列またはワイド文字列のいずれかを指します

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

strtoxxx関数はconst-correctではありません。文字列ポインターを受け取り、文字列内で const非ポインターを返すためです。const

また、Normative Amendment 1 (C95) 以降、atoxx関数は関数に包含されていると見なされstrtoxxxます。そのため、C95 もそれ以降の標準も、これらの関数のワイド文字バージョンを提供していません。反対の議論atoxxは、エラーと を区別しないということです0[82]

人気のある拡張機能

名前 プラットホーム 説明
bzero[83] [84] POSIXBSD バッファをゼロ バイトで埋めます。memset
memccpy[85] SVID、POSIX オーバーラップしてはならない 2 つのメモリ領域間で指定されたバイト数までコピーし、特定のバイトが見つかると停止します。
mempcpy[86] GNU memcpy最後に書き込まれたバイトの次のバイトへのポインタを返す バリアント
strcasecmp[87] POSIX、BSD の大文字と小文字を区別しないバージョンstrcmp
strcat_s[88] ウィンドウズ strcatコピーする前にコピー先のバッファ サイズをチェック するバリアント
strcpy_s[89] ウィンドウズ strcpyコピーする前にコピー先のバッファ サイズをチェック するバリアント
strdup[90] POSIX 文字列を割り当てて複製します
strerror_r[91] POSIX1、GNU その変形strerrorはスレッドセーフです。GNU バージョンは POSIX バージョンと互換性がありません。
stricmp[92] ウィンドウズ の大文字と小文字を区別しないバージョンstrcmp
strlcpy[93] BSD、ソラリス strcpy宛先バッファに収まるように結果を切り詰めるバリアント[94]
strlcat[93] BSD、ソラリス strcat宛先バッファに収まるように結果を切り詰めるバリアント[94]
strsignal[95] POSIX:2008 信号コードの文字列表現を返しますスレッドセーフではありません。
strtok_r[96] POSIX そのバリアントstrtokはスレッドセーフです

置換

[15][11]をバッファー オーバーフローを許可しない関数に置き換える必要性が十分に確立されているにもかかわらず、受け入れられた標準はありません。これは、多くの C プログラマーが望ましい動作をしているという誤った考えが原因の 1 つです。ただし、どちらの関数もこのために設計されたものではなく (最新のソフトウェアではあまり使用されていないデータ形式である、null で埋められた固定サイズの文字列バッファーを操作することを目的としていました)、動作と引数は直感的ではなく、専門家によってさえ誤って記述されることがよくあります。プログラマー。[94]strcatstrcpystrncatstrncpy

最も一般的な[ a]代替品はstrlcatandstrlcpy関数で、1998 年 12 月にOpenBSD 2.4 で登場しました。これにより、切り捨ての検出が可能になり、切り捨てられない新しいバッファーを作成するためのサイズが提供されます。それらは、非効率的であるという主張に基づいて批判されてきました[97] (文字列のいくつかの優れた代替形式の代わりに) C 文字列の使用を奨励し[98] [99]、他の潜在的なエラーを隠しています。[100] [101]したがって、それらはGNU C ライブラリ(Linux 上のソフトウェアで使用)。ただし、OpenBSD、FreeBSDNetBSDSolarisOS XQNXの C ライブラリ、および2011 年に導入されたmuslなどの Linux の代替 C ライブラリに実装されています。 [ 102] [103] GNU C ライブラリのサポートがないからといって、さまざまなソフトウェア作成者が GNU C ライブラリを使用したり、他のSDLGLibffmpegrsync 、さらにはLinux カーネルの内部でさえ、代替品をバンドルしたりすることを止めていませんこれらの関数のオープン ソース実装が利用可能です。[104] [105]

memcpy[46]またはmemmove[48]が使用されることがありstrcpyます。これは、NUL を繰り返しチェックしないためより効率的である可能性があるためです (これは最近のプロセッサでは当てはまりません)。パラメータとしてバッファ長が必要なため、このパラメータを正しく設定すると、バッファ オーバーフローを回避できます。

2004 Security Development Lifecycleの一環として、Microsoft は(他の多くの機能と共に)strcpy_sおよびを含む「安全な」機能のファミリを導入しました。[106]これらの関数は、ISO/IEC WDTR 24731 によって提案されたオプションのC11 (Annex K)の一部としていくつかの小さな変更を加えて標準化されました。これらの関数は、文字列が長すぎてバッファーに収まらないかどうかなど、さまざまなチェックを実行します。チェックが失敗した場合、ユーザー指定の「ランタイム制約ハンドラー」関数が呼び出され、[107]通常はプログラムが中止されます。[108] [109]一部の関数は、ランタイム制約ハンドラを呼び出す前に破壊的な操作を実行します。たとえば、宛先を空の文字列に設定します。strcat_sstrcat_s[110]これにより、エラー状態からの回復やデバッグが困難になる可能性があります。これらの関数は、最初は Windows でのみ実装され、同時にMicrosoft Visual C++によって警告メッセージが生成され始めたため、プログラマーに標準関数の代わりにこれらの関数を使用するように提案したため、かなりの批判を集めました。これは、Microsoft が開発者をそのプラットフォームに閉じ込めようとする試みであると推測する人もいます。[111]これらの関数のオープンソース実装は利用可能ですが、これらの関数は一般的な Unix C ライブラリには存在しません。[112]これらの関数の経験から、採用と使用上の誤りに重大な問題があることがわかっているため、C 標準の次の改訂では、Annex K の削除が提案されています。[113]不要なコンパイラの最適化を回避する方法として、 の使用memset_sも提案されています。[114] [115]

も参照

注意事項

  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 maint: location (link)
  2. ^ 「C99 標準ドラフト + TC3」(PDF) . §6.4.5p7 . 2011年1月7日閲覧 {{cite web}}: CS1 maint: location (link)
  3. ^ 「C99 標準ドラフト + TC3」(PDF) . セクション 6.4.5 の脚注 66 2011年1月7日閲覧 {{cite web}}: CS1 maint: location (link)
  4. ^ 「基本型」 . en.cppreference.com
  5. ^ 「C99 標準ドラフト + TC3」(PDF) . §5.1.1.2翻訳フェーズ、p1 2011年 1223 日閲覧。 {{cite web}}: CS1 maint: location (link)
  6. ^ "文字列リテラル" . en.cppreference.com 2019年12月23日閲覧
  7. ^ 「c++ - 一般的なプログラミングでの wchar_t の使用は何ですか?」. スタック オーバーフロー2022年8月1日閲覧
  8. ^ "stddef.h - 標準型定義​​" . オープングループ2017年1月28日閲覧
  9. ^ ギラム、リチャード (2003). Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard . アディソン・ウェズリー・プロフェッショナル。p。714.ISBN _ 9780201700527.
  10. ^ "char, wchar_t, char8_t, char16_t, char32_t" . docs.microsoft.com 2022年8月1日閲覧
  11. ^ a b "strcpy - cppreference.com" . En.cppreference.com。2014 年 1 月 2 日2014年 3 月 6 日閲覧
  12. ^ "wcscpy - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  13. ^ "strncpy - cppreference.com" . En.cppreference.com。2013 年 10 月 4 日2014年 3 月 6 日閲覧
  14. ^ "wcsncpy - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  15. ^ a b "strcat - cppreference.com" . En.cppreference.com。2013 年 10 月 8 日2014年 3 月 6 日閲覧
  16. ^ "wcscat - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  17. ^ "strncat - cppreference.com" . En.cppreference.com。2013 年 7 月 1 日2014年 3 月 6 日閲覧
  18. ^ "wcsncat - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  19. ^ "strxfrm - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  20. ^ "wcsxfrm - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  21. ^ "strlen - cppreference.com" . En.cppreference.com。2013 年 12 月 27 日2014年 3 月 6 日閲覧
  22. ^ "wcslen - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  23. ^ "strcmp - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  24. ^ "wcscmp - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  25. ^ "strncmp - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  26. ^ "wcsncmp - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  27. ^ "strcoll - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  28. ^ "wcscoll - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  29. ^ "strchr - cppreference.com" . En.cppreference.com。2014 年 2 月 23 日2014年 3 月 6 日閲覧
  30. ^ "wcschr - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  31. ^ "strrchr - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  32. ^ "wcsrchr - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  33. ^ "strspn - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  34. ^ "wcsspn - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  35. ^ "strcspn - cppreference.com" . En.cppreference.com。2013 年 5 月 31 日2014年 3 月 6 日閲覧
  36. ^ "wcscspn - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  37. ^ "strpbrk - cppreference.com" . En.cppreference.com。2013 年 5 月 31 日2014年 3 月 6 日閲覧
  38. ^ "wcspbrk - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  39. ^ "strstr - cppreference.com" . En.cppreference.com。2013 年 10 月 16 日2014年 3 月 6 日閲覧
  40. ^ "wcsstr - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  41. ^ "strtok - cppreference.com" . En.cppreference.com。2013 年 9 月 3 日2014年 3 月 6 日閲覧
  42. ^ "wcstok - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  43. ^ "strerror - cppreference.com" . En.cppreference.com。2013 年 5 月 31 日2014年 3 月 6 日閲覧
  44. ^ "memset - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  45. ^ "wmemset - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  46. ^ a b "memcpy - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  47. ^ "wmemcpy - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  48. ^ a b "memmove - cppreference.com" . En.cppreference.com。2014 年 1 月 25 日2014年 3 月 6 日閲覧
  49. ^ "wmemmove - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  50. ^ "memcmp - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  51. ^ "wmemcmp - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  52. ^ "memchr - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  53. ^ "wmemchr - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  54. ^ "mblen - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  55. ^ "mbtowc - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  56. ^ "wctomb - cppreference.com" . En.cppreference.com。2014 年 2 月 4 日2014年 3 月 6 日閲覧
  57. ^ "mbstowcs - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  58. ^ "wcstombs - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  59. ^ "btowc - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  60. ^ "wctob - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  61. ^ "mbsinit - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  62. ^ "mbrlen - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  63. ^ "mbrtowc - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  64. ^ "wcrtomb - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  65. ^ "mbsrtowcs - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  66. ^ "wcsrtombs - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  67. ^ 「6.3.2 変換の状態を表す」 . GNU C ライブラリ2017年1 月 31 日閲覧
  68. ^ "root/src/multibyte/c16rtomb.c" . 2017年1 月 31 日閲覧
  69. ^ 「/stable/11/lib/libc/locale/c16rtomb.c の内容」. 2017年1 月 31 日閲覧
  70. ^ "atof - cppreference.com" . En.cppreference.com。2013 年 5 月 31 日2014年 3 月 6 日閲覧
  71. ^ "atoi, atol, atoll - cppreference.com" . En.cppreference.com。2014 年 1 月 18 日2014年 3 月 6 日閲覧
  72. ^ "strtof、strtod、strtold - cppreference.com" . En.cppreference.com。2014 年 2 月 4 日2014年 3 月 6 日閲覧
  73. ^ "strtof、strtod、strtold - cppreference.com" . En.cppreference.com。2014 年 2 月 4 日2014年 3 月 6 日閲覧
  74. ^ "strtof、strtod、strtold - cppreference.com" . En.cppreference.com。2014 年 2 月 4 日2014年 3 月 6 日閲覧
  75. ^ "wcstof、wcstod、wcstold - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  76. ^ "wcstof、wcstod、wcstold - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  77. ^ "wcstof、wcstod、wcstold - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  78. ^ "strtol、strtoll - cppreference.com" . En.cppreference.com。2014 年 2 月 4 日2014年 3 月 6 日閲覧
  79. ^ "wcstoll, wcstoll - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  80. ^ "strtoul, strtoull - cppreference.com" . En.cppreference.com。2014 年 2 月 4 日2014年 3 月 6 日閲覧
  81. ^ "wcstoul, wcstoull - cppreference.com" . En.cppreference.com 2014年 3 月 6 日閲覧
  82. ^ C99 根拠、7.20.1.1
  83. ^ "ビーゼロ" . オープングループ2017年11 月 27 日閲覧
  84. ^ "bzero(3)" . OpenBSD . 2017年11 月 27 日閲覧
  85. ^ "memccpy" . Pubs.opengroup.org 2014年 3 月 6 日閲覧
  86. ^ "mempcpy(3) - Linux マニュアル ページ" . Kernel.org . 2014年 3 月 6 日閲覧
  87. ^ "strcasecmp(3) - Linux マニュアル ページ" . Kernel.org . 2014年 3 月 6 日閲覧
  88. ^ "strcat_s, wcscat_s, _mbscat_s" . docs.microsoft.com 2022年4月22日閲覧
  89. ^ "strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l" . docs.microsoft.com 2022年4月22日閲覧
  90. ^ "strdup" . Pubs.opengroup.org 2014年 3 月 6 日閲覧
  91. ^ "strerror(3) - Linux マニュアル ページ" . man7.org 2019年11月3日閲覧
  92. ^ "文字列 | stricmp()" . C プログラミング Expert.com . 2014年 3 月 6 日閲覧
  93. ^ a b "strlcpy, strlcat — サイズ制限のある文字列のコピーと連結" . OpenBSD . 2016年 5 月 26 日閲覧
  94. ^ a b c d トッド C. ミラー。テオ・デ・ラート (1999)。「strlcpy と strlcat – 一貫性があり安全な文字列のコピーと連結」 . USENIX '99。
  95. ^ "strsignal" . Pubs.opengroup.org 2014年 3 月 6 日閲覧
  96. ^ "strtok" . Pubs.opengroup.org 2014年 3 月 6 日閲覧
  97. ^ ミラー、ダミアン (2005 年 10 月). 「セキュアポータビリティ」(PDF) . 2016年 6 月 26 日閲覧この [strlcpy と strlcat] API は、ほとんどの最新のオペレーティング システムと多くのスタンドアロン ソフトウェア パッケージで採用されています [...]。注目すべき例外は GNU 標準 C ライブラリである glibc であり、その保守担当者はこれらの改善された API を含めることを断固として拒否し、「恐ろしく非効率な BSD のがらくた」とラベル付けしています。
  98. ^ libc-alpha メーリング リスト、2000 年 8 月 8 日のスレッドからの抜粋メッセージ: 53 60 61
  99. ^ strlcpy(); の浮き沈み LWN.net
  100. ^ "glibc への strlcpy() の追加" . lwn.net . 文字列を正しく処理するということは、文字列の長さを常に把握しているため、(strcpy の代わりに) memcpy を実行できることを意味します。
  101. ^ strlcpy(3)  –  Linuxライブラリ関数マニュアル 「しかし、strlcpy() と strlcat() の目的全体を無効にするため、そのような最適化の有効性に疑問を呈する人がいるかもしれません。実際のところ、このマニュアル ページの最初のバージョンでは誤りがありました。 "
  102. ^ "root/src/string/strlcpy.c" . 2017年1月28日閲覧
  103. ^ "root/src/string/strlcat.c" . 2017年1月28日閲覧
  104. ^ トッド・C・ミラー. "strlcpy.c" . BSDクロスリファレンス
  105. ^ トッド・C・ミラー. "strlcat.c" . BSDクロスリファレンス
  106. ^ ラヴェル、マーティン. 「Visual Studio 2005 の安全な C および C++ ライブラリを使用してコードへの攻撃を撃退する」. 2015年 2 月 13 日閲覧
  107. ^ 「C11 標準ドラフト」(PDF) . §K.3.1.4p2 . 2013年2月13日閲覧 {{cite web}}: CS1 maint: location (link)
  108. ^ 「C11 標準ドラフト」(PDF) . §K.3.6.1.1p4 . 2013年2月13日閲覧 {{cite web}}: CS1 maint: location (link)
  109. ^ 「パラメーターの検証」 .
  110. ^ 「C11 標準ドラフト」(PDF) . §K.3.7.2.1p4 . 2013年2月13日閲覧 {{cite web}}: CS1 maint: location (link)
  111. ^ ダニー・カレフ. 「彼らは再びそれに取り組んでいます」 . お知らせします。2012 年 1 月 15 日にオリジナルからアーカイブされました2011年11月10日閲覧
  112. ^ 安全な C ライブラリ。「Safe C ライブラリは、ISO/IEC TR24731 に基づいて境界チェック メモリと文字列関数を提供します」 . ソースフォージ2013年3月6日閲覧
  113. ^ "Annex K のフィールド エクスペリエンス — 境界チェック インターフェイス" . 2015年11月5日閲覧
  114. ^ "MSC06-C. コンパイラの最適化に注意" . SEI CERT C コーディング標準
  115. ^ memset_s(3)  –  FreeBSDライブラリ関数マニュアル

外部リンク

  • C の高速 memcpy、さまざまなタイプの CPU 命令アーキテクチャをターゲットとする複数の C コーディング例