• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列検索について)

文字列検索について

このQ&Aのポイント
  • C++プログラムにおいて、検索対象の文字列が見つからない場合に-1を返す理由について説明してください
  • C++の文字列検索プログラムにおいて、Good Morning! の「r」以降が検索にひっかからない理由を教えてください
  • C++の文字列検索プログラムにおいて、Good Morning! の「r」以降が検索にひっかからない理由について詳しく教えてください

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#1の回答で既に答えが出ていますが、補足します。 for(int i=0; i<(signed)strlen(s); i++){ ... } というコードなのに、ループ内でs++;しているのが問題です。ループを回るたびにstrlen(s)が評価され、s++されているので当然ループを回るたびに値がstrlenの結果が1ずつ減り、全部の文字列を探索しません。 s++というコードを書きたいなら、 while (*s != '\0') { ... s++; } というコードにしてはいかがでしょうか。 あるいは、sを変更しないようにします。 ...毎回、strlenを呼んでいるのが無駄だと思いますが。 for(size_t i=0; i<strlen(s); i++){ if (s[i] == c) { ... } ... } しかしながら、文字の検索をするとしたら、プログラミングの勉強でもない限り、#2の回答のようにするか、strchrを使うかだと思います。 #include <string.h> int strch_idx(const char* s, char c) { char* p = strchr(s, c); return p == NULL ? -1 : p - s; } あと、これも何を言っているのかわかりませんが。 // 配列のインデックスは0オリジンだが、インデックスは1からだから1+する このルール通りにやるとしたら、#2の回答も自分のstrchrのプログラムも文字を発見した時の返り値を+1したほうがよいでしょうね。インデックスを1始まりとしてC言語/C++のプログラムを書くのはやめたほうがよいと思いますが。

beterugius
質問者

お礼

ご回答、どうもありがとうございました。

beterugius
質問者

補足

長文のご説明、どうも有難うございました。 インデックスを1オリジンにすることは、わかってはいるのですが、極力避けたいと思います。

その他の回答 (2)

回答No.2

[1] std::string つかえばいいのに int strch_idx(const std::string& s, char c) { std::string::size_type p = s.find(c); return p == std::string::npos ? -1 : p; } [2] あるいは: int strch_idx(const char* s, char c) { const char* p = std::find(s, s+strlen(s), c); return p == s+strlen(s) ? -1 : p - s; }

beterugius
質問者

お礼

ご回答、どうもありがとうございました。

beterugius
質問者

補足

確かに三項演算子を利用すると、スマートなコードになりますね。std::string を頭に入れておきたいと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

for の条件にある i<(signed)strlen(s) を評価するごとに strlen を呼び出すよね.

beterugius
質問者

お礼

ご回答、どうもありがとうございました。

beterugius
質問者

補足

int strch_idx(const char* s, char c){ int temp; int len = (signed)strlen(s); for(int i=0; i<len; i++){ ~... とすることで、解決しました。 ご指導、どうもありがとうございました。