[C言語] 文字列がひらがなかどうか判定する方法を解説
C言語で文字列がひらがなかどうかを判定するには、各文字のUnicodeコードポイントを確認します。
ひらがなのUnicode範囲は、U+3040からU+309Fです。
文字列をループで走査し、各文字をcodeポイントに変換してこの範囲内にあるかをチェックします。
この方法は、マルチバイト文字を扱うために適切なライブラリや関数を使用する必要があります。
特に、ロケール設定やエンコーディングに注意が必要です。
ひらがな判定のアルゴリズム
ひらがな判定のアルゴリズムは、文字列内の各文字がひらがなであるかどうかを確認する方法です。
C言語では、文字のUnicode値を利用して判定を行います。
ひらがなのUnicode範囲は、0x3040から0x309Fまでです。
この範囲内にある文字はすべてひらがなと見なされます。
アルゴリズムの基本的な流れは、文字列を1文字ずつチェックし、各文字がこの範囲内にあるかどうかを確認することです。
すべての文字がひらがなであれば、文字列全体がひらがなで構成されていると判定できます。
この方法は、シンプルで効率的なひらがな判定を実現します。
C言語でのひらがな判定プログラムの実装
必要なライブラリのインクルード
C言語でひらがな判定を行うためには、ワイド文字を扱うためのwchar.hと、ロケール設定を行うためのlocale.hをインクルードします。
また、標準入出力を扱うためのstdio.hも必要です。
これにより、ワイド文字(マルチバイト文字)を正しく処理し、ひらがな判定を行うことが可能になります。
#include <stdio.h>
#include <wchar.h>
#include <locale.h>ひらがな判定関数の作成
ひらがな判定を行う関数isHiraganaを作成します。
この関数は、ワイド文字(wchar_t型)を引数として受け取り、その文字がひらがなであるかどうかを判定します。
ひらがなのUnicode範囲は0x3040から0x309Fまでです。この範囲内に文字が含まれているかをチェックします。
int isHiragana(wchar_t c) {
    // ひらがなのUnicode範囲をチェック
    return (c >= L'ぁ' && c <= L'ん');
}メイン関数での判定処理
メイン関数では、ユーザーから入力されたワイド文字列を受け取り、その文字列がすべてひらがなで構成されているかを判定します。
まず、ロケールを設定してワイド文字が正しく扱えるようにします。
その後、ユーザー入力を受け取り、各文字をisHiragana関数でチェックします。もしひらがなでない文字が見つかった場合は、ひらがなではないと出力します。
int main() {
    wchar_t input[100];
    int isAllHiragana = 1; // すべてひらがなであると仮定
    // ロケールの設定
    setlocale(LC_ALL, "");
    // ユーザーからの入力を受け取る
    wprintf(L"文字列を入力してください: ");
    fgetws(input, sizeof(input) / sizeof(wchar_t), stdin);
    // 入力の改行文字を取り除く
    input[wcslen(input) - 1] = L'int main() {
wchar_t input[100];
int isAllHiragana = 1; // すべてひらがなであると仮定
// ロケールの設定
setlocale(LC_ALL, "");
// ユーザーからの入力を受け取る
wprintf(L"文字列を入力してください: ");
fgetws(input, sizeof(input) / sizeof(wchar_t), stdin);
// 入力の改行文字を取り除く
input[wcslen(input) - 1] = L'\0';
// 文字列の各文字をチェック
for (int i = 0; i < wcslen(input); i++) {
if (!isHiragana(input[i])) {
isAllHiragana = 0;
break;
}
}
// 判定結果を出力
if (isAllHiragana) {
wprintf(L"入力された文字列はすべてひらがなです。\n");
} else {
wprintf(L"入力された文字列にはひらがな以外の文字が含まれています。\n");
}
return 0;
}
';
    // 文字列の各文字をチェック
    for (int i = 0; i < wcslen(input); i++) {
        if (!isHiragana(input[i])) {
            isAllHiragana = 0;
            break;
        }
    }
    // 判定結果を出力
    if (isAllHiragana) {
        wprintf(L"入力された文字列はすべてひらがなです。\n");
    } else {
        wprintf(L"入力された文字列にはひらがな以外の文字が含まれています。\n");
    }
    return 0;
}動作の説明
このプログラムは、ユーザーが入力した文字列がすべてひらがなで構成されているかを判定します。入力がひらがなでない場合は、その旨を出力します。
文字列を入力してください: こんにちは
入力された文字列はすべてひらがなです。このように、setlocaleによるロケールの設定を行い、ワイド文字を使用することで、C言語でも正確にひらがなを判定することができます。
応用例
カタカナや漢字の判定方法
ひらがな以外にも、カタカナや漢字の判定を行うことができます。
カタカナのUnicode範囲は0x30A0から0x30FF、漢字は0x4E00から0x9FAFです。これらの範囲を利用して、ひらがな判定関数と同様にカタカナや漢字の判定関数を作成できます。
int isKatakana(wchar_t c) {
    return (c >= L'ァ' && c <= L'ン');
}
int isKanji(wchar_t c) {
    return (c >= L'一' && c <= L'龯');
}文字列の正規化と判定
文字列の正規化は、異なる表記の文字列を統一するためのプロセスです。例えば、全角と半角の違いを吸収するために正規化を行います。
C言語では、正規化を行うための標準ライブラリはありませんが、外部ライブラリ(例: ICUライブラリ)を利用することで実現可能です。
正規化後に、ひらがなやカタカナの判定を行うことで、より正確な判定が可能になります。
マルチバイト文字列への対応
C言語でマルチバイト文字列を扱う場合、wchar_t型やmbstowcs関数を使用します。これにより、UTF-8などのマルチバイトエンコーディングに対応した文字列操作が可能になります。
ワイド文字列を扱う際は、各文字のバイト数に注意し、適切な関数を使用して文字列を操作します。
#include <wchar.h>
#include <locale.h>
int isHiragana(wchar_t c) {
    // ひらがなのUnicode範囲をチェック
    return (c >= L'ぁ' && c <= L'ん');
}
int isKatakana(wchar_t c) {
    return (c >= L'ァ' && c <= L'ン');
}
int isKanji(wchar_t c) {
    return (c >= L'一' && c <= L'龯');
}
int main() {
    setlocale(LC_ALL, ""); // ロケールの設定
    wchar_t wstr[] = L"よろしくお願いいたいしマス"; // ワイド文字列の処理
    // 文字列の各文字を判定する例
    for (int i = 0; i < wcslen(wstr); i++) {
        if (isHiragana(wstr[i])) {
            wprintf(L"%lcはひらがなです。\n", wstr[i]);
        }
        else if (isKatakana(wstr[i])) {
            wprintf(L"%lcはカタカナです。\n", wstr[i]);
        }
        else if (isKanji(wstr[i])) {
            wprintf(L"%lcは漢字です。\n", wstr[i]);
        }
    }
    return 0;
}よはひらがなです。
ろはひらがなです。
しはひらがなです。
くはひらがなです。
おはひらがなです。
願は漢字です。
いはひらがなです。
いはひらがなです。
たはひらがなです。
いはひらがなです。
しはひらがなです。
マはカタカナです。
スはカタカナです。文字列のフィルタリング
文字列のフィルタリングは、特定の条件に合致する文字を抽出または除去する操作です。
たとえば、ひらがな以外の文字を除去するフィルタリングを行う場合、文字列を走査し、ひらがなでない文字をスキップすることで実現できます。
フィルタリングを行うことで、特定の文字種のみを抽出したり、不要な文字を除去したりすることが可能です。
void filterHiragana(const wchar_t *input, wchar_t *output) {
    int j = 0;
    for (int i = 0; i < wcslen(input); i++) {
        if (isHiragana(input[i])) {
            output[j++] = input[i];
        }
    }
    output[j] = L'void filterHiragana(const wchar_t *input, wchar_t *output) {
int j = 0;
for (int i = 0; i < wcslen(input); i++) {
if (isHiragana(input[i])) {
output[j++] = input[i];
}
}
output[j] = L'\0'; // 終端文字を追加
}
'; // 終端文字を追加
}このように、ひらがな判定の応用として、カタカナや漢字の判定、文字列の正規化、マルチバイト文字列の対応、文字列のフィルタリングなど、さまざまな方法で文字列を操作することができます。
ワイド文字を用いることで、C言語でも日本語の文字列を正確に扱うことが可能です。
まとめ
この記事では、C言語を用いたひらがな判定の方法とその応用について解説しました。
ひらがな判定の基本的なアルゴリズムから、カタカナや漢字の判定、マルチバイト文字列への対応、文字列のフィルタリングまで、さまざまな技術を紹介しました。
これを機に、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)
![[C言語] stricmp関数の使い方 – 大文字小文字を区別しない比較](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47146.png)
![[C言語] strcspn関数の使い方 – 文字群が含まれる位置を検索](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47145.png)