C++
 Computer >> コンピューター >  >> プログラミング >> C++

C/C++におけるstrncmp()とstrcmp()の違いを徹底解説


strncmp()とは

strncmp()は、指定された文字数まで左側の文字列と右側の文字列を比較するための関数です。基本的な動作はstrcmp()と同じですが、「比較する最大文字数」を引数で指定できる点が大きな特徴です。

戻り値は以下のように決まります。

  • 比較した位置の文字同士がすべて等しい場合(または指定文字数内で差が出なかった場合):0
  • 左側の文字列の文字が、右側の対応する文字より大きいASCII値を持つ場合:0より大きい値
  • 左側の文字列の文字が、右側の対応する文字より小さいASCII値を持つ場合:0より小さい値

C言語におけるstrncmp()の構文は次のとおりです。

int strncmp(const char *leftString, const char *rightString, size_t number);

各引数の意味は以下のとおりです。

  • leftString − 右側の文字列と比較される最初の文字列。

  • rightString − 最初の文字列との比較に使用される2番目の文字列。

  • number − 比較する最大文字数。

サンプルコード

ここでは、先頭1文字だけを比較する例を示します。

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "blank";
    char str2[] = "Hello World!";
    int result = strncmp(str1, str2, 1);

    if (result == 0)
        printf("文字列は等しい\n");
    else
        printf("文字列は等しくない\n");

    printf("strncmp()が返した値: %d\n", result);
    return 0;
}

実行結果

文字列は等しくない
strncmp()が返した値: 26

この例では、先頭1文字のみを比較しています。'b'のASCII値は98、'H'のASCII値は72であるため、その差26が返されます。0以外の値なので、2つの文字列は「等しくない」と判定されます。


strcmp()とは

strcmp()は標準ライブラリに組み込まれた関数で、ヘッダーファイル「string.h」内で宣言されています。この関数は2つの文字列引数を比較するために使用され、辞書順(レキシコグラフィック順)で文字列を1文字ずつ比較していきます。

比較は各文字列の最初の文字から始まり、以下のいずれかの条件を満たすまで続けられます。

  • 両者の文字が一致しなくなったとき
  • NULL文字('\0')に到達したとき

最初の文字が等しければ2番目の文字を、それも等しければ3番目の文字を…というように順番に比較が進みます。そして、両方の文字列が完全に同一(すべての文字が同じ)であれば0を返します。

戻り値のルールはstrncmp()と同様です。

  • 一致した位置の左側の文字が、右側の文字より大きいASCII値を持つ場合:0より大きい値
  • 一致した位置の左側の文字が、右側の文字より小さいASCII値を持つ場合:0より小さい値

C言語におけるstrcmp()の構文は次のとおりです。

int strcmp(const char *leftString, const char *rightString);

各引数の意味は以下のとおりです。

  • leftString − 右側の文字列と比較される最初の文字列。

  • rightString − 最初の文字列との比較に使用される2番目の文字列。

サンプルコード

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "hello World!";
    char str2[] = "Hello World!";
    int result = strcmp(str1, str2);

    if (result == 0)
        printf("文字列は等しい\n");
    else
        printf("文字列は等しくない\n");

    printf("strcmp()が返した値: %d\n", result);
    return 0;
}

実行結果

文字列は等しくない
strcmp()が返した値: 32

この例では、先頭文字'h'(ASCII値104)と'H'(ASCII値72)が異なるため、その差32が返されます。大文字と小文字は別の文字として扱われる点に注意してください。


strncmp()とstrcmp()の違いまとめ

項目strcmp()strncmp()
比較範囲NULL文字に到達するまで全体を比較指定した文字数(number)まで比較
引数の数2つ(文字列×2)3つ(文字列×2+文字数)
主な用途文字列全体の完全な比較先頭部分だけを比較したい場合
戻り値等しければ0/大きければ正の値/小さければ負の値(共通)

このように、両者は戻り値のルールこそ共通していますが、strncmp()は比較する文字数を制御できるため、「接頭辞が一致しているかどうか」などを安全に確認したい場合に特に便利です。一方、文字列全体を厳密に比較したい場合はstrcmp()を使用します。

  1. C++の文字リテラルと文字列リテラルの違いをわかりやすく解説

    C++における文字リテラルと文字列リテラルの基本C++では、シングルクォート( )で囲まれた1文字は「文字リテラル」として扱われ、その型は char になります。例えば a は char 型であり、ASCIIベースのシステムでは整数値 97 を持ちます。一方、ダブルクォート( )で囲まれた1文字または複数文字の並びは「文字列リテラル」として扱われます。その型は const char[] であり、実体は「文字列の長さ + 1」のサイズを持つ配列です。この余分な1文字分は、文字列の終端を示すヌル文字(\0)として確保されています。具体的な違いのポイント文字リテラル: 原則として1文字のみを格納する

  2. C++の比較演算子(==)とstd::string::compare()の違いを徹底解説

    C++の比較演算子(==)とstd::string::compare()の違いとは? C++で文字列を比較する方法として、比較演算子 == と std::string::compare() の2つがあります。結論から言うと、この2つの違いは戻り値だけです。実際、string::operator==() は内部的に string::compare() を呼び出して実装されています。 戻り値の違い 比較演算子(==)は、2つの文字列が等しいかどうかを示す bool 型の値(true / false)を返します。一方、compare() は、2つの文字列が互いにどのような関係にあるかを示す int