以下は目次です。
文字列の中から、任意の文字を探したいとします。ただし、文字列の末尾に近いものを探すという条件があるとしましょう。
先頭に近いものを探す方法は、「逆引き 文字列から文字を探す」で取り上げています。
たとえば、“abcdabcd” から ‘c’ を探す場合、‘c’ は2つありますが、後ろから2文字目のところにある ‘c’ のほうを見つけてほしいということです。
この要求はつまり、ある文字が含まれているかどうかだけではなく、どこにあるかも重要だということでもあります。したがって、bool型の結果を返すのではなく、見つかった文字を指すポインタを返すように考えます。添字が必要なら、ポインタの減算(第32章)で対応できます。
/*
文字列の後ろの方から文字を探す。
引数
s: 対象の文字列
c: 探す文字
戻り値
見つかったらその文字のメモリアドレス。
見つからなかったらヌルポインタ。
*/
char* find_last_char(const char* s, char c);
int main(void)
{
const char s[] = "abcdabcd";
// 最後に現れる位置を調べる
char* p = find_last_char(s, 'c');
// 何文字目にあったか
if (p != NULL) {
ptrdiff_t index = p - s;
}
}
標準ライブラリには、この目的に合った strrchr関数があります。strrchr関数は、string.h で宣言されています。
実のところ、これを使うだけですべて解決します。冒頭で、find_last_char関数にまとめるような感じで考えましたが、strrchr関数をそのまま使うのでも問題ありません。自作の関数でラップするのなら、インライン関数(第57章)にして高速化を図るといいでしょう。
#include <stdio.h>
#include <string.h>
/*
文字列の後ろの方から文字を探す。
引数
s: 対象の文字列
c: 探す文字
戻り値
見つかったらその文字のメモリアドレス。
見つからなかったらヌルポインタ。
*/
inline char* find_last_char(const char* s, char c)
{
return strrchr(s, c);
}
int main(void)
{
const char s[] = "abcdabcd";
char* p = find_last_char(s, 'c');
if (p == NULL) {
("not found");
puts}
else {
("found. (%td)\n", p - s);
printf}
}
実行結果:
found. (6)
return 0;
を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |