[C言語] strcmp関数の使い方 – 文字列を比較する
strcmp関数
は、C言語で2つの文字列を比較するために使用されます。
strcmp(文字列1,文字列2)
の形式で呼び出し、文字列1と文字列2を辞書順で比較します。
戻り値は、文字列1が文字列2より小さい場合は負の値、等しい場合は0、大きい場合は正の値です。
比較は文字列の各文字のASCII値に基づいて行われ、最初に異なる文字が見つかった時点で結果が決まります。
strcmp関数とは
strcmp関数
は、C言語において文字列を比較するための標準ライブラリ関数です。
この関数は、2つの文字列を引数として受け取り、それらの文字列が同じであるか、どちらが辞書順で先に来るかを判断します。
比較はASCIIコードに基づいて行われ、最初に異なる文字が見つかった時点で比較結果が決まります。
戻り値は、文字列が等しい場合は0、最初の文字列が辞書順で先の場合は負の値、後の場合は正の値となります。
このため、strcmp関数
は文字列のソートや検索、ユーザー入力の検証など、さまざまな場面で利用されます。
正確な比較を行うためには、文字列の終端を示すヌル文字(\0)にも注意が必要です。
strcmp関数の使い方
基本的な使用例
strcmp関数
の基本的な使い方を以下のサンプルコードで示します。
この例では、2つの文字列を比較し、その結果を出力します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "こんにちは"; // 1つ目の文字列
const char *str2 = "こんにちは"; // 2つ目の文字列
int result = strcmp(str1, str2); // 文字列を比較
if (result == 0) {
printf("文字列は同じです。\n"); // 同じ場合の出力
} else {
printf("文字列は異なります。\n"); // 異なる場合の出力
}
return 0;
}
文字列は同じです。
戻り値を使った条件分岐
strcmp関数
の戻り値を利用して、条件分岐を行うことができます。
以下のサンプルコードでは、2つの文字列を比較し、どちらが辞書順で先かを判定します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "apple"; // 1つ目の文字列
const char *str2 = "banana"; // 2つ目の文字列
int result = strcmp(str1, str2); // 文字列を比較
if (result < 0) {
printf("'%s' は '%s' よりも前にあります。\n", str1, str2); // str1が先の場合
} else if (result > 0) {
printf("'%s' は '%s' よりも後にあります。\n", str1, str2); // str1が後の場合
} else {
printf("文字列は同じです。\n"); // 同じ場合
}
return 0;
}
'apple' は 'banana' よりも前にあります。
大文字と小文字の違いに注意
strcmp関数
は大文字と小文字を区別して比較を行います。
例えば、”Apple”と”apple”は異なる文字列として扱われます。
以下のサンプルコードでその挙動を確認できます。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "Apple"; // 大文字の文字列
const char *str2 = "apple"; // 小文字の文字列
int result = strcmp(str1, str2); // 文字列を比較
if (result < 0) {
printf("'%s' は '%s' よりも前にあります。\n", str1, str2); // str1が先の場合
} else if (result > 0) {
printf("'%s' は '%s' よりも後にあります。\n", str1, str2); // str1が後の場合
} else {
printf("文字列は同じです。\n"); // 同じ場合
}
return 0;
}
'Apple' は 'apple' よりも前にあります。
NULLポインタを渡した場合の挙動
strcmp関数
にNULLポインタを渡すと、未定義の動作が発生します。
これはプログラムがクラッシュする原因となるため、NULLポインタを渡さないように注意が必要です。
以下のサンプルコードでは、NULLポインタを渡した場合の例を示します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = NULL; // NULLポインタ
const char *str2 = "テスト"; // 2つ目の文字列
// strcmp関数を呼び出すと未定義の動作が発生する
int result = strcmp(str1, str2); // これは危険な操作です
return 0;
}
このコードを実行すると、プログラムがクラッシュする可能性があります。
したがって、strcmp
を使用する際は、引数がNULLでないことを確認することが重要です。
strcmp関数の実際の動作
文字列の比較方法
strcmp関数
は、2つの文字列を1文字ずつ比較していくことで、文字列の等価性や辞書順を判断します。
比較は、最初の文字から始まり、各文字が等しい限り次の文字に進みます。
最初に異なる文字が見つかった時点で、その文字のASCIIコードを基に比較結果が決まります。
もし、全ての文字が等しい場合は、文字列の終端に達するまで比較が続きます。
ASCIIコードによる比較
strcmp関数
は、文字列の各文字をASCIIコードに基づいて比較します。
ASCIIコードは、各文字に対して数値を割り当てたもので、例えば、’A’は65、’B’は66、’a’は97、’b’は98というように、大小文字で異なる値を持ちます。
このため、strcmp関数
は大文字と小文字を区別し、例えば、’A’と’a’を比較すると、’A’の方が小さいため、負の値が返されます。
最初に異なる文字で比較が決まる仕組み
strcmp関数
は、文字列を比較する際に、最初に異なる文字が見つかった時点で比較結果を決定します。
以下のサンプルコードでは、2つの文字列を比較し、最初に異なる文字がどのように影響するかを示します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "apple"; // 1つ目の文字列
const char *str2 = "apricot"; // 2つ目の文字列
int result = strcmp(str1, str2); // 文字列を比較
if (result < 0) {
printf("'%s' は '%s' よりも前にあります。\n", str1, str2); // str1が先の場合
} else if (result > 0) {
printf("'%s' は '%s' よりも後にあります。\n", str1, str2); // str1が後の場合
} else {
printf("文字列は同じです。\n"); // 同じ場合
}
return 0;
}
'apple' は 'apricot' よりも前にあります。
この例では、最初の異なる文字である’l’と’r’のASCIIコードを比較し、’l’が’r’よりも小さいため、strcmp関数
は負の値を返します。
終端文字(終端文字(\0)の扱い
)の扱い
C言語では、文字列はヌル終端(\0)で終了します。
strcmp関数
は、文字列の比較を行う際に、この終端文字を重要な要素として扱います。
比較が全ての文字で等しい場合、最終的にヌル終端に達することで、2つの文字列が同じであると判断されます。
以下のサンプルコードでは、終端文字の扱いを示します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "hello"; // 1つ目の文字列
const char *str2 = "hello"; // 2つ目の文字列
int result = strcmp(str1, str2); // 文字列を比較
if (result == 0) {
printf("文字列は同じです。\n"); // 同じ場合
} else {
printf("文字列は異なります。\n"); // 異なる場合
}
return 0;
}
文字列は同じです。
この例では、両方の文字列が同じであり、ヌル終端に達するまで全ての文字が等しいため、strcmp関数
は0を返します。
ヌル終端が正しく扱われることで、文字列の比較が正確に行われることが保証されます。
応用例
複数の文字列をソートする
strcmp関数
は、文字列のソートに非常に便利です。
C言語の標準ライブラリには、qsort関数
があり、これを使って文字列の配列をソートすることができます。
以下のサンプルコードでは、strcmp
を利用して文字列の配列を昇順にソートします。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 比較関数
int compare(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b); // strcmpを使用
}
int main() {
const char *strings[] = {"banana", "apple", "cherry", "date"}; // 文字列の配列
int n = sizeof(strings) / sizeof(strings[0]); // 配列の要素数
qsort(strings, n, sizeof(const char *), compare); // ソート
// ソート結果の出力
for (int i = 0; i < n; i++) {
printf("%s\n", strings[i]);
}
return 0;
}
apple
banana
cherry
date
ユーザー入力の検証に使う
strcmp関数
は、ユーザーからの入力を検証する際にも役立ちます。
例えば、特定のパスワードとユーザーが入力したパスワードを比較することができます。
以下のサンプルコードでは、ユーザーが入力したパスワードを検証します。
#include <stdio.h>
#include <string.h>
int main() {
const char *correctPassword = "secret123"; // 正しいパスワード
char userInput[50]; // ユーザー入力用の配列
printf("パスワードを入力してください: ");
scanf("%49s", userInput); // ユーザーからの入力を取得
if (strcmp(userInput, correctPassword) == 0) {
printf("パスワードが正しいです。\n"); // 正しい場合
} else {
printf("パスワードが間違っています。\n"); // 間違った場合
}
return 0;
}
パスワードを入力してください: secret123
パスワードが正しいです。
辞書順での並び替え
strcmp関数
を使用することで、文字列を辞書順に並び替えることができます。
これは、特に文字列のリストを表示する際に便利です。
以下のサンプルコードでは、複数の文字列を辞書順に並べ替えます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 比較関数
int compare(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b); // strcmpを使用
}
int main() {
const char *words[] = {"zebra", "apple", "orange", "banana"}; // 文字列の配列
int n = sizeof(words) / sizeof(words[0]); // 配列の要素数
qsort(words, n, sizeof(const char *), compare); // 辞書順にソート
// ソート結果の出力
for (int i = 0; i < n; i++) {
printf("%s\n", words[i]);
}
return 0;
}
apple
banana
orange
zebra
大文字・小文字を無視した比較(strcasecmp関数の紹介)
大文字と小文字を区別せずに文字列を比較したい場合、strcasecmp関数
を使用することができます。
この関数は、strcmp
と同様の機能を持ちながら、大文字と小文字を無視して比較を行います。
以下のサンプルコードでは、strcasecmp
を使用して文字列を比較します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "Hello"; // 大文字の文字列
const char *str2 = "hello"; // 小文字の文字列
if (strcasecmp(str1, str2) == 0) { // 大文字・小文字を無視して比較
printf("文字列は同じです。\n"); // 同じ場合
} else {
printf("文字列は異なります。\n"); // 異なる場合
}
return 0;
}
文字列は同じです。
このように、strcasecmp
を使用することで、大文字と小文字を無視した比較が簡単に行えます。
これにより、ユーザー入力の検証や文字列の比較がより柔軟になります。
strcmp関数と他の文字列比較関数の違い
strncmp関数との違い
strncmp関数
は、strcmp関数
と似ていますが、比較する文字数を指定できる点が異なります。
strncmp
は、指定した文字数分だけを比較し、文字列の一部だけを評価することができます。
これにより、部分一致の比較が可能になります。
以下のサンプルコードでは、strncmp
を使用して最初の3文字だけを比較します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "apple"; // 1つ目の文字列
const char *str2 = "apricot"; // 2つ目の文字列
int result = strncmp(str1, str2, 3); // 最初の3文字を比較
if (result == 0) {
printf("最初の3文字は同じです。\n"); // 同じ場合
} else {
printf("最初の3文字は異なります。\n"); // 異なる場合
}
return 0;
}
最初の3文字は異なります。
このように、strncmp
を使用することで、特定の文字数だけを比較することができます。
strcasecmp関数との違い
strcasecmp関数
は、strcmp関数
と同様に文字列を比較しますが、大文字と小文字を区別しない点が異なります。
これにより、ユーザー入力の検証や文字列の比較を行う際に、より柔軟な対応が可能になります。
以下のサンプルコードでは、strcasecmp
を使用して大文字・小文字を無視して比較します。
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "Hello"; // 大文字の文字列
const char *str2 = "hello"; // 小文字の文字列
if (strcasecmp(str1, str2) == 0) { // 大文字・小文字を無視して比較
printf("文字列は同じです。\n"); // 同じ場合
} else {
printf("文字列は異なります。\n"); // 異なる場合
}
return 0;
}
文字列は同じです。
このように、strcasecmp
を使用することで、大文字と小文字を無視した比較が簡単に行えます。
memcmp関数との違い
memcmp関数
は、メモリブロックを比較するための関数であり、文字列だけでなく任意のデータ型のメモリを比較することができます。
strcmp
やstrncmp
が文字列専用であるのに対し、memcmp
はバイナリデータの比較にも使用されます。
以下のサンプルコードでは、memcmp
を使用して2つのバイナリデータを比較します。
#include <stdio.h>
#include <string.h>
int main() {
const char data1[] = {0x01, 0x02, 0x03}; // 1つ目のデータ
const char data2[] = {0x01, 0x02, 0x03}; // 2つ目のデータ
int result = memcmp(data1, data2, sizeof(data1)); // メモリを比較
if (result == 0) {
printf("データは同じです。\n"); // 同じ場合
} else {
printf("データは異なります。\n"); // 異なる場合
}
return 0;
}
データは同じです。
このように、memcmp
を使用することで、任意のメモリブロックを比較することができ、文字列以外のデータ型にも対応しています。
strcmp
やstrncmp
は文字列専用であるため、用途に応じて使い分けることが重要です。
まとめ
この記事では、C言語のstrcmp関数
について、その基本的な使い方や実際の動作、応用例、他の文字列比較関数との違いを詳しく解説しました。
strcmp関数
は、文字列の比較を行うための重要なツールであり、特にソートやユーザー入力の検証において非常に役立ちます。
今後は、strcmp関数
を活用して、より効率的な文字列処理を行ってみてください。