- ベストアンサー
文字列検索について
- C++プログラムにおいて、検索対象の文字列が見つからない場合に-1を返す理由について説明してください
- C++の文字列検索プログラムにおいて、Good Morning! の「r」以降が検索にひっかからない理由を教えてください
- C++の文字列検索プログラムにおいて、Good Morning! の「r」以降が検索にひっかからない理由について詳しく教えてください
- みんなの回答 (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++のプログラムを書くのはやめたほうがよいと思いますが。
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
[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; }
お礼
ご回答、どうもありがとうございました。
補足
確かに三項演算子を利用すると、スマートなコードになりますね。std::string を頭に入れておきたいと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
for の条件にある i<(signed)strlen(s) を評価するごとに strlen を呼び出すよね.
お礼
ご回答、どうもありがとうございました。
補足
int strch_idx(const char* s, char c){ int temp; int len = (signed)strlen(s); for(int i=0; i<len; i++){ ~... とすることで、解決しました。 ご指導、どうもありがとうございました。
お礼
ご回答、どうもありがとうございました。
補足
長文のご説明、どうも有難うございました。 インデックスを1オリジンにすることは、わかってはいるのですが、極力避けたいと思います。