[C言語] strcmpを使わずに文字列を比較する方法を解説
C言語で文字列を比較する際、通常はstrcmp
関数を使用しますが、これを使わずに比較する方法もあります。
文字列は配列として扱われるため、ループを用いて各文字を一つずつ比較することが可能です。
例えば、while
ループを使用して、各文字が等しいかどうかを確認し、異なる文字が見つかった時点でループを終了させる方法があります。
この方法では、文字列の終端を示す'\0'
に注意し、両方の文字列が同時に終端に達した場合に等しいと判断します。
手動で文字列を比較する方法
C言語で文字列を比較する際、標準ライブラリのstrcmp関数
を使わずに手動で比較する方法があります。
ここでは、ループ、ポインタ、文字コードを利用した3つの方法を紹介します。
ループを使った文字列比較
ループを使って文字列を1文字ずつ比較する方法です。
for
ループやwhile
ループを用いて、各文字を順番に比較していきます。
#include <stdio.h>
int compareStrings(const char *str1, const char *str2) {
int i = 0;
// 文字列を1文字ずつ比較
while (str1[i] != '\0' && str2[i] != '\0') {
if (str1[i] != str2[i]) {
return str1[i] - str2[i];
}
i++;
}
// 文字列の長さが異なる場合の処理
return str1[i] - str2[i];
}
int main() {
const char *string1 = "こんにちは";
const char *string2 = "こんばんは";
int result = compareStrings(string1, string2);
if (result == 0) {
printf("文字列は同じです。\n");
} else {
printf("文字列は異なります。\n");
}
return 0;
}
文字列は異なります。
このコードでは、compareStrings関数
が2つの文字列を1文字ずつ比較し、異なる場合はその差を返します。
文字列が同じ場合は0を返します。
ポインタを使った文字列比較
ポインタを使って文字列を比較する方法です。
ポインタを使うことで、文字列の各文字に直接アクセスし、比較を行います。
#include <stdio.h>
int compareStrings(const char *str1, const char *str2) {
// ポインタを使って文字列を比較
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2;
}
str1++;
str2++;
}
// 文字列の長さが異なる場合の処理
return *str1 - *str2;
}
int main() {
const char *string1 = "おはよう";
const char *string2 = "おはよう";
int result = compareStrings(string1, string2);
if (result == 0) {
printf("文字列は同じです。\n");
} else {
printf("文字列は異なります。\n");
}
return 0;
}
文字列は同じです。
このコードでは、ポインタを使って文字列を比較し、異なる場合はその差を返します。
ポインタを使うことで、コードがより簡潔になります。
文字コードを利用した比較
文字コードを利用して、文字列を比較する方法です。
各文字のASCII値を比較することで、文字列の順序を判断します。
#include <stdio.h>
int compareStrings(const char *str1, const char *str2) {
// 文字コードを利用して比較
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2;
}
str1++;
str2++;
}
// 文字列の長さが異なる場合の処理
return *str1 - *str2;
}
int main() {
const char *string1 = "さようなら";
const char *string2 = "さよなら";
int result = compareStrings(string1, string2);
if (result == 0) {
printf("文字列は同じです。\n");
} else {
printf("文字列は異なります。\n");
}
return 0;
}
文字列は異なります。
このコードでは、文字コードを利用して文字列を比較し、異なる場合はその差を返します。
文字コードを利用することで、文字列の辞書順を判断することができます。
応用例
文字列比較の基本を理解したところで、応用的な比較方法についても見ていきましょう。
ここでは、大文字と小文字を区別しない比較、部分文字列の比較、文字列の辞書順比較について解説します。
大文字と小文字を区別しない比較
大文字と小文字を区別せずに文字列を比較する方法です。
通常の比較では文字コードが異なるため、大文字と小文字は別の文字として扱われますが、これを無視して比較することができます。
#include <stdio.h>
#include <ctype.h>
int compareStringsIgnoreCase(const char *str1, const char *str2) {
// 大文字と小文字を区別しない比較
while (*str1 != '\0' && *str2 != '\0') {
if (tolower(*str1) != tolower(*str2)) {
return tolower(*str1) - tolower(*str2);
}
str1++;
str2++;
}
return tolower(*str1) - tolower(*str2);
}
int main() {
const char *string1 = "Hello";
const char *string2 = "hello";
int result = compareStringsIgnoreCase(string1, string2);
if (result == 0) {
printf("文字列は同じです。\n");
} else {
printf("文字列は異なります。\n");
}
return 0;
}
文字列は同じです。
このコードでは、tolower関数
を使って各文字を小文字に変換し、大文字と小文字を区別せずに比較しています。
部分文字列の比較
文字列の一部を比較する方法です。
特定の位置から始まる部分文字列を比較することで、文字列の一部が一致するかどうかを確認できます。
#include <stdio.h>
#include <string.h>
int compareSubstrings(const char *str1, const char *str2, size_t start, size_t length) {
// 部分文字列を比較
for (size_t i = 0; i < length; i++) {
if (str1[start + i] != str2[i]) {
return str1[start + i] - str2[i];
}
}
return 0;
}
int main() {
const char *string1 = "こんにちは世界";
const char *string2 = "世界";
int result = compareSubstrings(string1, string2, 5, strlen(string2));
if (result == 0) {
printf("部分文字列は同じです。\n");
} else {
printf("部分文字列は異なります。\n");
}
return 0;
}
部分文字列は同じです。
このコードでは、compareSubstrings関数
が指定された位置から始まる部分文字列を比較し、一致するかどうかを判断します。
文字列の辞書順比較
文字列を辞書順に比較する方法です。
これは、文字列の順序を決定する際に役立ちます。
#include <stdio.h>
int compareStringsLexicographically(const char *str1, const char *str2) {
// 辞書順で文字列を比較
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main() {
const char *string1 = "apple";
const char *string2 = "banana";
int result = compareStringsLexicographically(string1, string2);
if (result < 0) {
printf("'%s'は'%s'より前にあります。\n", string1, string2);
} else if (result > 0) {
printf("'%s'は'%s'より後にあります。\n", string1, string2);
} else {
printf("文字列は同じです。\n");
}
return 0;
}
'apple'は'banana'より前にあります。
このコードでは、compareStringsLexicographically関数
が文字列を辞書順に比較し、順序を決定します。
辞書順比較は、文字列のソートや検索において重要な役割を果たします。
まとめ
文字列比較はC言語プログラミングにおいて基本的かつ重要な操作です。
手動での文字列比較を通じて、柔軟な実装やパフォーマンスの最適化が可能であることを学びました。
この記事を参考に、実際のプログラムで文字列比較を試してみてください。