[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関数
を使用して、str1
とstr2
が大文字小文字を区別せずに同じであることを確認しています。
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関数
を使用して、str1
とstr2
の最初の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;
}
部分一致が見つかりました。
この例では、str1
とstr2
を小文字に変換し、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関数
で配列をソートしています。
これにより、大文字小文字を区別せずに文字列をソートすることができます。
よくある質問
まとめ
大文字小文字を区別しない文字列検索は、ユーザーの利便性を向上させるために重要な技術です。
この記事では、標準ライブラリの関数や自作関数を用いた実装方法、応用例について解説しました。
これらの知識を活用して、より柔軟で使いやすいプログラムを開発してみてください。