strchr関数とstrrchr関数は、文字列中から指定された文字を検索します。strchr関数とstrrchr関数の相違は、strchr関数は文字列の先頭から検索を開始するのに対して、strrchr関数は文字列の最後から開始します。従って、strchr関数は最初に現れた文字を検索し、strrchr関数は最後に現れた文字を検索します。

#include <string.h>
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);

*sは検索対象文字列を指定します。
cは検索する文字を指定します。

戻り値として、検索できた場合は検索した文字のアドレスを返します。検索できなかった場合はNULLを返します。

プログラム 例

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1024

int main()
{
  FILE             *fp;
  char             path[50];
  char             key;
  char             buff[SIZE];
  char             *buff_ptr;
  int              key_cnt;

  printf('ファイルのパス名を入力してください ==> ');
  scanf('%s%*c', path);

  if ((fp = fopen(path, 'r')) == NULL) {
    fprintf(stderr, '%sのオープンができませんでした\n', path);
    exit(EXIT_FAILURE);
  }

  printf('検索する文字を入力してください ==> ');
  scanf('%c%*c', &key);

  key_cnt = 0;
  while(fgets(buff, SIZE, fp) != NULL) {
    buff_ptr = buff;
    while (*buff_ptr) {
      if ((buff_ptr = strchr(buff_ptr, key)) != NULL) {
        ++key_cnt;
        ++buff_ptr;
      }
      else {
        break;
      }
    }
  }
  fclose(fp);

  printf('%sファイルには%cが%d個ありました\n', path, key, key_cnt);

  return EXIT_SUCCESS;
}

例の実行結果

$ cat temp.txt
#include <stdio.h>

int main()
{
  printf('Hello World!!.\n');

  return 0;
}
$
$ ./strchr.exe
ファイルのパス名を入力してください ==> temp.txt
検索する文字を入力してください ==> i
temp.txtファイルにはiが5個ありました
$
$ ./strchr.exe
ファイルのパス名を入力してください ==> temp.txt
検索する文字を入力してください ==> !
temp.txtファイルには!が2個ありました
$