C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のstrchr()関数とは?文字列から文字を検索する方法をわかりやすく解説

C++には、文字列操作を簡単に行うための標準ライブラリ関数が数多く用意されています。その中のひとつが strchr() 関数です。strchr() は、指定した文字列の中から特定の文字が最初に現れる位置を検索し、その位置へのポインタを返す関数です。この関数を使用するには、ヘッダーファイル <cstring> をインクルードする必要があります。

strchr()関数の構文

strchr() 関数の構文は以下のとおりです。

char *strchr( const char *str, int c )

各引数の意味は次のとおりです。

  • str: 検索対象となる文字列(C言語形式のヌル終端文字列)
  • c: 検索したい文字(int型で渡されますが、内部的にはcharとして扱われます)

この関数は、文字列 str の中で文字 c が最初に見つかった位置へのポインタを返します。もし文字が見つからなかった場合は、NULLポインタが返されます。また、文字列末尾のヌル文字('\0')も検索対象に含まれるため、'\0' を検索すると文字列の終端位置を取得することもできます。

例1: 文字の最初の出現位置を求める

まずは、strchr() を使って文字列中の特定の文字の位置を調べる基本的なプログラムを見てみましょう。

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char str[] = "strings";
    char *c = strchr(str, 's');
    cout << "First occurrence of character " << *c << " in the string is at position " << c - str + 1;
    return 0;
}

出力結果

First occurrence of character s in the string is at position 1

プログラムの解説

このプログラムでは、まず文字列 str を「strings」として定義しています。次に、strchr(str, 's') を呼び出すことで、文字列の中で最初に「s」が現れた位置へのポインタを c に格納しています。

ポイントとなるのは、c - str + 1 の部分です。ポインタ同士の減算を行うことで、先頭アドレスからの相対的な位置(インデックス)を計算できます。ここに1を加えることで、人間にとってわかりやすい「1番目から始まる位置」に変換しています。

char str[] = "strings";
char *c = strchr(str, 's');
cout << "First occurrence of character " << *c << " in the string is at position " << c - str + 1;

例2: 特定文字以降の文字列(接尾辞)を表示する

strchr() 関数は戻り値がポインタであることを利用すると、特定の文字が最初に出現した位置以降の部分文字列(接尾辞)を簡単に取り出すこともできます。以下にその例を示します。

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char str[] = "strings";
    char *c = strchr(str, 'i');
    cout << "Remaining string after first occurance of " << *c << " is " << c;
    return 0;
}

出力結果

Remaining string after first occurance of i is ings

プログラムの解説

このプログラムでは、文字列「strings」の中から文字「i」を検索しています。strchr() が返すのは「i」が存在する位置へのポインタなので、そのポインタを cout に渡して出力すると、C++は自動的にそこからヌル文字までを文字列として読み取り、「ings」が表示されます。

char str[] = "strings";
char *c = strchr(str, 'i');
cout << "Remaining string after first occurance of " << *c << " is " << c;

まとめ

strchr() 関数を使うことで、文字列内の特定の文字を効率的に検索できます。主な特徴を整理すると以下のようになります。

  • 指定した文字が最初に出現する位置へのポインタを返す
  • 文字が見つからない場合は NULL を返すため、使用前に必ずNULLチェックを行うのが安全
  • ポインタ演算を組み合わせれば、出現位置のインデックスそれ以降の部分文字列も取得可能
  • C言語由来の関数のため、std::string クラスではなく char 配列に対して動作する

なお、現代的なC++プログラミングでは std::string::find() メソッドを使う方法もありますが、C言語形式の文字列を扱う場面や既存コードの保守では strchr() の理解が不可欠です。ぜひ使いこなせるようにしておきましょう。

  1. C++の純粋関数とは?特徴とstrlen()・sqrt()を使った実装例をわかりやすく解説

    純粋関数(Pure Function)とは、同じ引数の値に対して常に同じ結果を返す関数のことです。純粋関数は結果を返すだけにとどまり、引数の変更、入出力ストリームへのアクセス、出力生成といった余計な副作用(Side Effect)を一切持ちません。この性質により、純粋関数はプログラムの動作が予測しやすく、テストやデバッグ、並列処理においても扱いやすいという大きなメリットがあります。純粋関数と非純粋関数の例C++標準ライブラリには、純粋関数として振る舞うものが多数存在します。代表的な例としては以下のような関数が挙げられます。純粋関数の例: sin()、strlen()、sqrt()、max()、

  2. C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説

    swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s