C言語関数:_ismbbtrail





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■_ismbbtrail
cが漢字の2バイト目か判定

【分類】
日本語対応文字関数

【書式】
int _ismbbtrail(unsigned int c);

【パラメータの型と説明】

パラメータ説明
unsigned int c文字

【機能説明】
文字cがマルチバイト文字の2バイト目(0x40 - 0x7E/0x80 - 0xEC)であれば0以外の値を返します。
それ以外の場合は0を返します。

この関数は、_ismbblead()関数と密接に関係しています。 先に_ismbblead()関数を参照してください。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。

C:\StudyC\MyProg>expr _ismbbtrail("Aあア亜"[0])
<int>8 0x8

C:\StudyC\MyProg>expr _ismbbtrail("Aあア亜"[1])
<int>8 0x8

C:\StudyC\MyProg>expr _ismbbtrail("Aあア亜"[2])
<int>8 0x8

※なぜ「8」という中途半端な値が返ってきているかは、_ismbblead()関数を参照してください。

1番目から予想に反した結果になっているのではないでしょうか。 _ismbbtrail()関数は、TRUE(0以外)となる範囲が多いので単体で使ってもあまり意味がありません。 _ismbblead()関数がTRUEだった場合に、その2バイト目をチェックするといった使い方が一般的です。

C:\StudyC\MyProg>expr _ismbblead("Aあア亜"[0]) && _ismbbtrail("Aあア亜"[1])
<int>0 0x0

C:\StudyC\MyProg>expr _ismbblead("Aあア亜"[1]) && _ismbbtrail("Aあア亜"[2])
<int>1 0x1

C:\StudyC\MyProg>expr _ismbblead("Aあア亜"[2]) && _ismbbtrail("Aあア亜"[3])
<int>0 0x0

期待通りの結果が得られるようになったのではないでしょうか。

次に_ismbblead()関数で問題があった「亜」の2バイト目と「A」ではどうなるか試してみましょう。

C:\StudyC\MyProg>expr _ismbblead("亜A"[1]) && _ismbbtrail("亜A"[2])
<int>1 0x1

このパターンはうまくいきません。 _ismbblead()関数と_ismbbtrail()関数を組み合わせることで判別の精度はある程度上がりますが、結局はうまく漢字を判別することができません。

全角/半角混じり文字列を扱うには、文字列の先頭から評価することが不可欠です。
下記のケーススタディを参照してもらえば理解してもらえると思います。
C言語ケーススタディ 全角文字の処理方法
C言語ケーススタディ 全角/半角混じり文字列の文字数
C言語ケーススタディ 全角/半角混じり文字列内の文字検索

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>

main()
{
        printf("%d\n", _ismbbtrail("Aあア亜"[0]));
        printf("%d\n", _ismbbtrail("Aあア亜"[1]));
        printf("%d\n", _ismbbtrail("Aあア亜"[2]));
        printf("---------------\n");
        printf("%d\n", _ismbblead("Aあア亜"[0]) && _ismbbtrail("Aあア亜"[1]));
        printf("%d\n", _ismbblead("Aあア亜"[1]) && _ismbbtrail("Aあア亜"[2]));
        printf("%d\n", _ismbblead("Aあア亜"[2]) && _ismbbtrail("Aあア亜"[3]));
        printf("---------------\n");
        printf("%d\n", _ismbblead("亜A"[1]) && _ismbbtrail("亜A"[2]));
}

実行結果は以下になります。

8
8
8
---------------
0
1
0
---------------
1

【参照関数】
_ismbblead
_ismbbkana

【使用例】
C言語ケーススタディ 全角文字の処理方法
C言語ケーススタディ 全角/半角混じり文字列の文字数
C言語ケーススタディ 全角/半角混じり文字列内の文字検索