[C言語] 大文字小文字を区別せずに文字列検索を行う方法


C言語で大文字小文字を区別せずに文字列検索を行うには、標準ライブラリの関数を活用する方法があります。

具体的には、strcasecmp関数を使用することで、文字列を比較する際に大文字小文字を無視することができます。

この関数は、POSIX標準の一部であり、string.hヘッダーファイルに含まれています。

ただし、Windows環境では_stricmpを使用する必要があります。

これにより、異なるケースの文字列を同一視して検索を行うことが可能です。

この記事でわかること
  • strcasecmpやstrncasecmpを用いた大文字小文字を区別しない文字列比較の方法
  • 自作関数による文字列の大文字・小文字変換と検索の実装
  • 部分一致検索や正規表現を用いた高度な検索の応用例
  • 大文字小文字を区別しないソートの実装方法

目次から探す

C言語での大文字小文字を区別しない検索方法

標準ライブラリを利用した方法

strcasecmp関数の利用

strcasecmp関数は、2つの文字列を大文字小文字を区別せずに比較するための関数です。

この関数はPOSIX標準であり、LinuxやmacOSなどの環境で利用可能です。

#include <stdio.h>
#include <strings.h> // strcasecmpを使用するために必要
int main() {
    // 文字列の定義
    char *str1 = "Hello World";
    char *str2 = "hello world";
    // strcasecmpを使用して比較
    if (strcasecmp(str1, str2) == 0) {
        printf("文字列は同じです。\n");
    } else {
        printf("文字列は異なります。\n");
    }
    return 0;
}
文字列は同じです。

この例では、strcasecmp関数を使用して、str1str2が大文字小文字を区別せずに同じであることを確認しています。

strncasecmp関数の利用

strncasecmp関数は、指定した長さまでの文字列を大文字小文字を区別せずに比較するための関数です。

#include <stdio.h>
#include <strings.h> // strncasecmpを使用するために必要
int main() {
    // 文字列の定義
    char *str1 = "Hello World";
    char *str2 = "hello";
    // strncasecmpを使用して比較
    if (strncasecmp(str1, str2, 5) == 0) {
        printf("最初の5文字は同じです。\n");
    } else {
        printf("最初の5文字は異なります。\n");
    }
    return 0;
}
最初の5文字は同じです。

この例では、strncasecmp関数を使用して、str1str2の最初の5文字が大文字小文字を区別せずに同じであることを確認しています。

自作関数による実装

文字列を小文字に変換する方法

文字列を小文字に変換するには、tolower関数を使用して各文字を変換します。

#include <stdio.h>
#include <ctype.h> // tolowerを使用するために必要
void toLowerCase(char *str) {
    while (*str) {
        *str = tolower(*str);
        str++;
    }
}
int main() {
    char str[] = "Hello World";
    toLowerCase(str);
    printf("小文字に変換: %s\n", str);
    return 0;
}
小文字に変換: hello world

この例では、toLowerCase関数を使用して、文字列全体を小文字に変換しています。

文字列を大文字に変換する方法

文字列を大文字に変換するには、toupper関数を使用して各文字を変換します。

#include <stdio.h>
#include <ctype.h> // toupperを使用するために必要
void toUpperCase(char *str) {
    while (*str) {
        *str = toupper(*str);
        str++;
    }
}
int main() {
    char str[] = "Hello World";
    toUpperCase(str);
    printf("大文字に変換: %s\n", str);
    return 0;
}
大文字に変換: HELLO WORLD

この例では、toUpperCase関数を使用して、文字列全体を大文字に変換しています。

変換後の文字列での検索

変換後の文字列を使用して検索を行う方法を示します。

#include <stdio.h>
#include <string.h>
#include <ctype.h> // tolowerを使用するために必要
void toLowerCase(char *str) {
    while (*str) {
        *str = tolower(*str);
        str++;
    }
}
int main() {
    char str1[] = "Hello World";
    char str2[] = "WORLD";
    // 文字列を小文字に変換
    toLowerCase(str1);
    toLowerCase(str2);
    // strstrを使用して検索
    if (strstr(str1, str2) != NULL) {
        printf("文字列が見つかりました。\n");
    } else {
        printf("文字列が見つかりませんでした。\n");
    }
    return 0;
}
文字列が見つかりました。

この例では、toLowerCase関数を使用して両方の文字列を小文字に変換し、strstr関数を使用して検索を行っています。

これにより、大文字小文字を区別せずに文字列を検索することができます。

応用例

部分一致検索の実装

部分一致検索は、文字列の一部が他の文字列に含まれているかを確認する方法です。

大文字小文字を区別せずに部分一致検索を行うには、文字列を小文字または大文字に変換してから検索を行います。

#include <stdio.h>
#include <string.h>
#include <ctype.h> // tolowerを使用するために必要
void toLowerCase(char *str) {
    while (*str) {
        *str = tolower(*str);
        str++;
    }
}
int main() {
    char str1[] = "Programming in C is fun";
    char str2[] = "c is";
    // 文字列を小文字に変換
    toLowerCase(str1);
    toLowerCase(str2);
    // strstrを使用して部分一致検索
    if (strstr(str1, str2) != NULL) {
        printf("部分一致が見つかりました。\n");
    } else {
        printf("部分一致が見つかりませんでした。\n");
    }
    return 0;
}
部分一致が見つかりました。

この例では、str1str2を小文字に変換し、strstr関数を使用して部分一致を確認しています。

正規表現を用いた高度な検索

正規表現を用いることで、より柔軟なパターンマッチングが可能になります。

C言語で正規表現を使用するには、regex.hライブラリを利用します。

#include <stdio.h>
#include <regex.h> // 正規表現を使用するために必要
int main() {
    regex_t regex;
    int reti;
    char msgbuf[100];
    // 正規表現のコンパイル
    reti = regcomp(®ex, "c[[:space:]]+is", REG_ICASE);
    if (reti) {
        fprintf(stderr, "正規表現のコンパイルに失敗しました\n");
        return 1;
    }
    // 正規表現による検索
    reti = regexec(®ex, "Programming in C is fun", 0, NULL, 0);
    if (!reti) {
        puts("正規表現に一致しました");
    } else if (reti == REG_NOMATCH) {
        puts("正規表現に一致しませんでした");
    } else {
        regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
        fprintf(stderr, "正規表現の実行に失敗しました: %s\n", msgbuf);
        return 1;
    }
    // 正規表現の解放
    regfree(®ex);
    return 0;
}
正規表現に一致しました

この例では、regcomp関数で正規表現をコンパイルし、regexec関数で文字列に対して検索を行っています。

REG_ICASEフラグを使用することで、大文字小文字を区別せずに検索を行います。

大文字小文字を区別しないソート

大文字小文字を区別せずに文字列をソートするには、比較関数を自作し、qsort関数を使用します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> // tolowerを使用するために必要
int caseInsensitiveCompare(const void *a, const void *b) {
    // 文字列を小文字に変換して比較
    return strcasecmp(*(const char **)a, *(const char **)b);
}
int main() {
    const char *arr[] = {"Banana", "apple", "Orange", "banana"};
    size_t arrSize = sizeof(arr) / sizeof(arr[0]);
    // qsortを使用してソート
    qsort(arr, arrSize, sizeof(const char *), caseInsensitiveCompare);
    // ソート結果の表示
    for (size_t i = 0; i < arrSize; i++) {
        printf("%s\n", arr[i]);
    }
    return 0;
}
apple
Banana
banana
Orange

この例では、strcasecmpを使用した比較関数caseInsensitiveCompareを定義し、qsort関数で配列をソートしています。

これにより、大文字小文字を区別せずに文字列をソートすることができます。

よくある質問

strcasecmpが使えない環境ではどうすればいい?

strcasecmpが利用できない環境では、自作の関数を作成して大文字小文字を区別せずに文字列を比較することができます。

例えば、各文字をtolowerまたはtoupperを使って変換しながら比較する方法があります。

例:int customStrcasecmp(const char *s1, const char *s2) { while (*s1 && tolower(*s1) == tolower(*s2)) { s1++; s2++; } return tolower(*s1) - tolower(*s2); }

大文字小文字を区別しない検索はどのような場面で役立つ?

大文字小文字を区別しない検索は、ユーザーが入力するデータが大文字小文字を混在している場合に役立ちます。

例えば、ユーザー名やメールアドレスの検索、テキストのフィルタリング、データベースのクエリなどで、ユーザーの入力ミスを防ぎ、より柔軟な検索を実現します。

パフォーマンスを向上させる方法はある?

パフォーマンスを向上させるためには、以下の方法を考慮することができます:

  • 文字列の変換を最小限に抑える:必要な部分だけを変換することで、処理時間を短縮できます。
  • 比較の際に早期終了を行う:一致しないことが判明した時点で比較を終了することで、無駄な処理を減らします。
  • 大量のデータを扱う場合は、効率的なデータ構造やアルゴリズムを使用することを検討します。

まとめ

大文字小文字を区別しない文字列検索は、ユーザーの利便性を向上させるために重要な技術です。

この記事では、標準ライブラリの関数や自作関数を用いた実装方法、応用例について解説しました。

これらの知識を活用して、より柔軟で使いやすいプログラムを開発してみてください。

  • URLをコピーしました!
目次から探す