見出し画像

C言語-#3.str*chr

はおはお。

意外と使ってない人が多そうな印象。「文字」をスキャンしよう!

strchr
strrchr


strchr

const char* strchr(const char* s, int ch) {
  const char* t_s = 0;

  for (;;) {
    char s_ch = *s++;

    if (s_ch == '\0') {
      break;
    } else if (s_ch == (char)ch) {
      t_s = s - 1;
      break;
    }
  }

  return t_s;
}

前からスキャン、NULLになったら終了っていう簡単な処理。無限ループには for を使ってます。while(1) でもいいのだけれど、定数を入れないささやかな抵抗w
ch が見つかったらアドレスを返す。

strrchr

const char* strrchr(const char* s, int ch) {
  const char* t_s = 0;

  for (;;) {
    char ch2 = *s++;

    if (ch2 == '\0') {
      break;
    } else if (ch2 == (char)ch) {
      t_s = s - 1;
    }
  }

  return t_s;
}

指定した文字が最後に出てくる位置をスキャンする。ちょっと特殊な方法を取ってます。スキャンして見つかったら位置を計算、NULLになるまで走査します。
s + strlen(s) からの *s-- をやると思った? こっちだと一度 終端位置まで回さないといけないのです。少しでも条件分岐を減らすにはってとこです。標準ライブラリと比べてみると面白いですよ~♪

おしまい

特段 難しいことはしていないけど、この関数はめっちゃ便利だから使おうね。文字を見つけるのに自分で書いてたら標準ライブラリをよく知らないんだーって思われちゃうかも?
ぶっちゃけキレイならなんでもいいです。

悉く書を信ずれば則ち書無きに如かず