C言語関数:_mbsrchr





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無料利用についての詳細は、このページを参照してください。




■_mbsrchr
文字の検索(マルチバイト対応)

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

【書式】
unsigned char *_mbsrchr(const unsigned char *s, unsigned int c);

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

パラメータ説明
const unsigned char *s文字列
unsigned int c検索文字

【機能説明】
strrchr()関数のマルチバイト文字対応関数です。 基本的な使い方は、strrchr()関数を参照してください。
検索対象の文字列にマルチバイト文字が含まれていると、strrchr()関数は誤った結果を返すことがあります。 _mbsrchr()関数はマルチバイト文字に対しても正しく検索を行うことができます。

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

C:\StudyC\MyProg>expr printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", 'c'))
cdeカキクケコ
<int>14 0xe

C:\StudyC\MyProg>expr printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", L'ク'))
クケコ
<int>7 0x7

C:\StudyC\MyProg>expr printf("%s\n", _mbsrchr("あいうえおabcdeあいうえお", L'う'))
うえお
<int>22 0x16

C:\StudyC\MyProg>expr printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", 'f'))
(null)
<int>7 0x7

C:\StudyC\MyProg>expr printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", L'サ'))
(null)
<int>7 0x7

C:\StudyC\MyProg>expr printf("%s\n", strrchr("ABCアイウ", 'C'))
Cウ
<int>4 0x4

C:\StudyC\MyProg>expr printf("%s\n", _mbsrchr("ABCアイウ", 'C'))
Cアイウ
<int>8 0x8

※↑カーソルキーを押すと入力したコマンドが呼び出されるので文字を変更して試してみてください。
1番目は文字列の「cde...」の位置(ポインタ)が返されます。
2番目は文字列の「クケコ」の位置(ポインタ)が返されます。
3番目は文字列内に「う」という文字が2個所に存在しますが後ろから検索するので最後の「うえお」の位置(ポインタ)が返されます。
4番目は文字列内に「f」という文字が含まれないのでNULL(0)が返されます。
5番目は文字列内に「サ」という文字が含まれないのでNULL(0)が返されます。
6番目と7番目は全角文字を指定した時のstrrchr()関数の失敗例と_mbsrchr()関数での成功例です。
失敗理由については、全角/半角混じり文字列内の文字検索で解説しているので参照してください。

実行結果ですが、最初の行に printf() 関数が出力した文字列が表示され2行目(「<int>14 0xe」の部分)にprintf()関数が返した値が表示されます。 printf()関数は表示した文字数を関数の返り値として返します。最後の改行文字も含めた文字数です。

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

#include <stdio.h>

main()
{
        printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", 'c'));
        printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", L'ク'));
        printf("%s\n", _mbsrchr("あいうえおabcdeあいうえお", L'う'));
        printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", 'f'));
        printf("%s\n", _mbsrchr("あいうえおabcdeカキクケコ", L'サ'));
        printf("%s\n", strrchr("ABCアイウ", 'C'));
        printf("%s\n", _mbsrchr("ABCアイウ", 'C'));
}

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

cdeカキクケコ
クケコ
うえお
(null)
(null)
Cウ
Cアイウ

マルチバイト文字が含まれているときの問題点については全角/半角混じり文字列内の文字検索で解説しております。
また、文字列の先頭から検索を行うときは_mbschr()関数を使用します。

【参照関数】
strchr
_mbschr