

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
はじめに
プログラミングをしていると、文字列の前半だけを比較したい場面があります。そんなとき使えるのが strncmp です。本記事では strncmp とは何か、どう使うのかを、初心者にも分かるように丁寧に解説します。
strncmpとは何か
strncmp は C 言語の標準ライブラリ string.h にある関数で、2 つの文字列の先頭から n 文字まで を比較します。strcmp は文字列の全長を比較しますが、strncmp は前方の n 文字だけ を見て比較します。結果は 整数として返され、0 の場合は「同じ前方の部分文字列」であることを意味します。0 以外の場合は、比較した文字の差分に基づく値が返ります。
この機能は、長さが決まっていない文字列同士を一部だけ比較したいときや、バッファの一部だけを検査したいときに便利です。たとえばファイル名の接頭辞を確認したいときや、ユーザー入力の最長部分だけをチェックする場面などで使えます。
使い方の基本
使い方の基本は strncmp(s1, s2, n) の形式です。第1引数と第2引数は比較対象の文字列、第3引数は比較する文字数です。以下は説明用のサンプルです。
サンプルコードの流れを追って説明します。
char a[] = "abcdef";
char b[] = "abcxyz";
int r = strncmp(a, b, 3); // 結果は 0、先頭の 3 文字は同じ
int r2 = strncmp(a, b, 4); // 結果は 0 ではなく、4 文字目の差で負または正の値になる
ここで重要なのは n が 0 のときは必ず 0 になる点と、s1 または s2 が NULL でないかを事前に確認する点です。実際のコードでは size_t 型の n を使い、ヘッダの string.h を忘れずに include します。
仕様のポイントと注意点
返り値の解釈 は次のとおりです。0 → 同じ前方の文字列、負の値 → s1 の方が辞書的に小さい、正の値 → s2 の方が小さい、という意味です。比較は 文字コード(通常は unsigned char の値) 同士の大小関係で決まります。日本語環境や特定のエンコーディングでは挙動が変わることはありませんが、ソースファイルのエンコーディングと文字列リテラルの扱いには注意してください。
比較表と実例
以下の表は strcmp と strncmp の違いをまとめたものです。実務でも役立つポイントを確認できます。
| 機能 | strcmp | strncmp |
|---|---|---|
| 比較範囲 | 文字列全体 | 先頭から n 文字 |
| 返り値 | 同じなら 0、異なると差の値 | 同じなら 0、異なると差の値 |
| 安全性のポイント | 長さが分からないと危険な場合あり | 前方の一定文字数だけ比較するので上限がある |
| 用途の例 | 完全一致の検査など | 接頭辞検査や一部比較のときに有効 |
よくある誤解と落とし穴
誤解の一つは n を過剰に大きくすると無駄な比較が増える ことです。実務では必要な長さだけを指定しましょう。もう一つは s1 と s2 が適切に終端されていないと正しく動かない 点です。C 言語では文字列は必ず終端の文字がないと不定動作の原因になります。ヘッダの string.h を include し、配列のサイズと境界を意識してください。
まとめ
strncmp は先頭の n 文字だけを比較することで、文字列全体を比較する strcmp よりも局所的な検査に適しています。使い方はシンプルで、strncmp(s1, s2, n) という形です。安全に使うためには n の意味と文字列の終端、および string.h の include を忘れないようにしましょう。
strncmpの同意語
- 先頭N文字までの文字列比較
- 二つの文字列の先頭からN文字までを比較し、辞書順の差を返すC言語の文字列比較関数の一種。
- N文字までの部分文字列比較
- 二つの文字列の先頭N文字分だけを比較する処理を指す表現。
- 指定長文字列比較
- 指定した長さ分だけ文字列を比較することを指す表現。
- 最大N文字までの文字列比較
- 比較する文字数に上限を設けて比較することを示す表現。
- 前方N文字比較
- 文字列の前方部分をN文字分だけ比較することを指す表現。
- 先頭N文字を比較する関数
- 先頭N文字を比較する機能を持つ関数の名称として用いられる表現。
- 部分文字列比較(N文字まで)
- 文字列の一部であるN文字までを比較する処理を表す表現。
- 上限付き文字列比較
- 比較する文字数に上限を設けて行う文字列の比較を表す表現。
- N文字までの長さでの比較
- 比較対象の長さをN文字までに限定して行う比較の表現。
- N文字までの比較
- 関数がN文字までを対象として比較を行う処理を指す表現。
strncmpの対義語・反対語
- strcmp
- 文字列全体を終端nullまで比較する関数。strncmp が先頭から最大 n 文字だけを比較するのに対して、全体を対象とする点が対になる。結果は等しければ0、そうでなければ0以外の値を返します。
- stricmp
- ケースを区別せず比較する関数(大文字小文字を無視します)。Windows の stricmp、あるいは strcasecmp に相当します。
- strcasecmp
- ケースを区別せず比較する関数(大文字小文字を無視します)。POSIX系で一般的に利用される variant です。
- memcmp
- 任意のバイト列を長さ n で比較する関数。文字列に限定せず、データの生のバイト列を比較する点が strncmp の対比として挙げられます。
- strcpy
- ある文字列を別の場所へコピーする関数。比較ではなくデータの代入・移動を行う操作です。
- strcat
- 二つの文字列を連結して一つの文字列にする関数。比較ではなく、文字列内容の結合という操作です。
- memcpy
- メモリ領域へデータをコピーする関数。データの移動・複製を目的とし、比較機能は含みません。
- strstr
- 文字列の中に別の文字列が現れる位置を探す検索機能。比較そのものとは異なる処理ですが、等価/非等価の判断という意味で対義として挙げられることがあります。
strncmpの共起語
- strcmp
- s1 と s2 の全長を比較する C の文字列比較関数。文字列の終端まで同じかどうかを調べ、結果は負/0/正の整数で返る。
- strncasecmp
- 大文字小文字を区別せず、先頭から n 文字を比較する関数。POSIX 系環境で用いられるケースが多い。
- strcoll
- ロケール依存の順序で文字列を比較する関数。言語設定によって比較結果が変わることがある。
- string.h
- C 言語の標準ライブラリのヘッダファイル。文字列操作の宣言が含まれている。
- 文字列
- 比較対象として用いられる文字の列。C では通常は null 終端の char 配列として表現される。
- NULL終端
- 文字列の末尾を示すヌル文字(' ')が前提。これがないと未定義動作になることがある。
- 返り値
- 比較結果を表す整数。s1 が s2 より小さい場合は負、等しい場合は 0、大きい場合は正。
- n文字
- 比較する最大文字数。0 以上の値を取り、それを超える部分は比較されない。
- s1
- 比較対象の第一文字列。ポインタとして渡される。
- s2
- 比較対象の第二文字列。ポインタとして渡される。
- ポインタ
- 文字列データはポインタで参照され、メモリ上の連続データを指す。
- バッファ境界
- n の制限内でのみ比較するため、境界条件を正しく扱う必要がある。
- 用途
- 先頭から n文字だけを比較したい場合に使用。ソート・検索・検証の前処理として活用される。
- 関連関数
- strcmp(全長比較)、strcoll、strncasecmp など、文字列比較に関連する他の関数と併用されることが多い。
strncmpの関連用語
- strncmp
- C標準ライブラリの文字列比較関数。s1とs2を最大n文字まで比較し、同じなら0、先頭から不一致が生じた場合はその差(s1の該当文字とs2の該当文字のunsigned char値の差)を返します。比較は文字として扱われるため大文字小文字の区別もあります。
- strcmp
- strncmpと同様に文字列を比較しますが、全長を対象に先頭から順に比較します。完全一致なら0、そうでなければ差を返します。
- strncpy
- 最大n文字までsrcをdestへコピーします。srcの長さがn未満ならdestをnull終端で埋めますが、srcの長さがn以上の場合は終端を付けません。固定長バッファを初期化する用途には有用ですが、文字列として扱う際には終端をどう扱うか注意が必要です。
- strcpy
- null終端を含む文字列をdestへコピーします。コピー先のバッファサイズを超えないよう事前に容量を確認する必要があります。
- memcmp
- メモリブロックをバイト単位で比較します。s1とs2の差を返し、比較はunsigned charとして行われるためデータ種別に依存しません。
- memcpy
- バイト数分のデータをsrcからdestへコピーします。文字列に限らず任意のデータにも使えますが、重なりがある場合は未定義動作になる点に注意です。
- memmove
- memcpyと同じくデータをコピーしますが、コピー元とコピー先が重なる場合にも正しく動作するよう設計されています。重複があるときはこちらを使うのが安全です。
- string.h
はC標準ライブラリの文字列操作関数を宣言するヘッダです。strncmp、strcmp、strcpy、strncpy、memcmp、memcpy、memmoveなどが含まれます。 - C標準ライブラリ
- C言語の標準機能を集約したライブラリ群。文字列操作を含む様々な関数が訓練された環境で利用できます。
- null終端
- 文字列は末尾に' '(ヌル文字)を置いて終端します。strncpy等の挙動では終端処理を忘れずに行うことが重要です。
- unsigned charでの比較
- 多くの文字比較は符号なしのchar(unsigned char)として比較されるため、正確な大小比較の解釈にはこの点を理解しておくと安全です。
- 安全な文字列操作のコツ
- 境界サイズを常に意識し、必要に応じて長さ制限付き関数を使い、終端を必ず確認します。入力データの長さを先に検証する習慣をつけましょう。
- バッファオーバーフローの回避
- 長さ制御を怠るとバッファの境界を超える書き込みが起き、脆弱性やクラッシュの原因になります。コピー時の容量チェックを徹底しましょう。
- 使い分けのポイント
- 部分文字列比較にはstrncmp、全体比較にはstrcmp、固定長データやバッファの初期化にはstrncpy、重複コピーにはmemmoveを選ぶと安全です。



















