C/C++におけるstrncmp()とstrcmp()の違いを徹底解説
strncmp()とstrcmp()は、どちらもASCII文字コードに基づいて2つの文字列を比較するC/C++の標準ライブラリ関数です。両者の最大の違いは、strncmp()には「比較する最大文字数」を指定する引数が1つ追加されている点です。
strcmp()は、文字列の終端を示すヌル文字('\0')を検出するまで比較を続けます。そのため、文字列が正しく終端されていない場合(ヌル文字が存在しない場合)、関数が正常に終了できず、メモリの範囲外を読み込んでしまう危険があります。
一方、strncmp()は指定された文字数に達した時点で比較を終了するため、終端文字の有無に依存せずに動作します。この特性により、文字列の妥当性が保証できない状況でも安全に比較できるという大きなメリットがあります。
主な違いのまとめ
- strcmp(): ヌル文字(
'\0')を検出するまで文字列全体を比較する。終端されていない文字列を渡すと危険。 - strncmp(): 第3引数で指定した文字数だけ比較し、そこで処理を終了する。安全性が高い。
サンプルコード
#include <stdio.h>
int main() {
char str1[] = "TutorialsPoint";
char str2[] = "Tutorials";
// strncmp()で最初の9文字を比較
int result1 = strncmp(str1, str2, 9);
if (result1 == 0) {
printf("str1とstr2の最初の9文字は一致!\n");
}
// strcmp()で文字列全体を比較
int result2 = strcmp(str1, str2);
if (result2 == 0) {
printf("str1とstr2は一致!\n");
} else {
if (result2 > 0) {
printf("str1はstr2より大きい!\n");
} else {
printf("str1はstr2より小さい!\n");
}
}
return 0;
}
実行結果
str1とstr2の最初の9文字は一致! str1はstr2より大きい!
この例では、str1(「TutorialsPoint」)とstr2(「Tutorials」)の最初の9文字が一致しているため、strncmp()は0を返します。一方、strcmp()で文字列全体を比較すると、10文字目以降に「Point」という差分があるため、ASCIIコードの順序に基づいてstr1の方が大きいと判定されます。
なお、両関数の戻り値は「0なら一致、正の値なら第1引数の方が大きい、負の値なら第2引数の方が大きい」という共通のルールに従います。用途に応じて、文字列全体を比較したい場合はstrcmp()、先頭部分だけを安全に比較したい場合はstrncmp()を使い分けるとよいでしょう。
-
【C/C++】const int* と int* const の違いを徹底解説!宣言の読み方のコツも紹介
はじめに:constとポインタの組み合わせ C/C++では、「const」と「ポインタ」を組み合わせた宣言が複数存在し、それぞれ意味が異なるため、初心者がつまずきやすいポイントの一つです。この記事では、代表的な4つのパターンを整理し、何が変更できて何が変更できないのかを具体例とともに解説します。 4つの基本パターン int* // intへのポインタ int const * // constなintへのポインタ int * const // intへのconstポインタ int const * const // con
-
C#におけるStringとStringBuilderの違いを徹底解説
C#における文字列(String)の特徴C#のstring型は不変(イミュータブル)です。つまり、一度生成した文字列は後から変更することができません。文字列に対して何らかの操作を行うと、そのたびにメモリ上に新しいstring型のオブジェクトが生成されます。 string str1 = Welcome!; // 新しい文字列インスタンスが生成される str1 += Hello; str1 += World; 上記のコードのように「+=」演算子で文字列を連結すると、連結のたびに新しい文字列オブジェクトが作成され、元のオブジェクトは不要になります。その結果、大量の文字列連結を繰り返す場合には、パフォ