[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] != '#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;
}
' && str2[i] != '#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;
}
') {
        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 != '#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;
}
' && *str2 != '#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;
}
') {
        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 != '#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;
}
' && *str2 != '#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;
}
') {
        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 != '#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;
}
' && *str2 != '#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;
}
') {
        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 != '#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;
}
' && *str2 != '#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;
}
') {
        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言語プログラミングにおいて基本的かつ重要な操作です。
手動での文字列比較を通じて、柔軟な実装やパフォーマンスの最適化が可能であることを学びました。
この記事を参考に、実際のプログラムで文字列比較を試してみてください。
 
![[C言語] atol関数の使い方 – 文字列をlong型数値に変換する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47138.png)
![[C言語] atof関数の使い方 – 文字列を浮動小数(double)に変換する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47137.png)
![[C言語] sprintf関数の使い方 – 複数の変数を文字列にフォーマット](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47139.png)
![[C言語] sscanf関数の使い方 – フォーマット指定でファイルから読み込む](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47140.png)
![[C言語] strcat 使い方 – 文字列の連結](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47141.png)
![[C言語] strcpy関数の使い方 – 文字列をコピーする](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47144.png)
![[C言語] strcmp関数の使い方 – 文字列を比較する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47143.png)
![[C言語] strchr関数の使い方 – 最初に見つかった文字の位置を取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47142.png)
![[C言語] strncat関数の使い方 – 指定文字分結合](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47148.png)
![[C言語] strlen関数の使い方 – 文字列の長さ(バイト数)の取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47147.png)