2016-09-09 6 views
1

charの最後の文字をcharのconst配列に戻す必要があります。私は[「helloe」]で文字のconstの配列を持っていると私は返す必要がchar型のインデックスが「E」であれば、あなたが必要な理由だから、それは5文字の定数配列内の最後の文字のインデックスを返します

//s is a const array of chars that equals ["helloe"] 
// c is the char "e" 
// I need to return the index of the last occurrence of e which is 5 
int reverse_find_character(const char s[], char c){ 
    std::vector<int> no; 
    size_t bob = strlen(s); 
    size_t i; 
    for (i=bob;i>bob;i++){ 
     if (s[i]==c){ 
      no.push_back((int)i); 

     } 
    return *max_element(no.begin(),no.end()); 
} 
+3

シンプルな計画が最初に出現を返すことですが、あなたの問題/質問は何 –

+1

リバースイテレータを使用していますか? – Jarod42

+1

'size'は' bob'よりも良い名前になります。 – Jarod42

答えて

1
std::vector<int> no; 

// ... 

no.push_back((int)i); 

を返します。ベクター?ベクトルは一切必要ありません。あなたは、検索された文字のすべての発生を覚える必要はありません。あなたは最後のものを見つける必要があります。

for (i=bob;i>bob;i++){ 

これはほとんど意味がありません。あなたの意図は、文字列の最後からスキャンを開始することです(bobは文字列の長さです)。これは合理的な最初のスタートになります。しかし、文字列の最後から開始してi=0に戻ることを意図している場合は、iが増分されずに減分されることが予想されます。さらに、比較はi>bobも意味をなさない。 iの初期値がbobの場合、式i>bobfalseと評価され、このループは決して実行されません。

  1. スタートは最初から最後まで、文字列をスキャン:

    とにかく、この全体のことは、あなたがそれだと思うよりも、実際にはるかに簡単です。

  2. 検索する文字が表示されるたびに、そのインデックスを変数に保存します。あなたが最初から最後までそれをスキャンしているので

したがって、スキャンの終了時に、この変数は、あなたの文字列内の文字の最後の位置の指標となります。言い換えれば

int reverse_find_character(const char s[], char c){ 
    int pos=-1; 
    size_t i; 

    for (i=0; s[i]; ++i) 
     if (s[i] == c) 
      pos = i; 

    return pos; 
} 

P.S.あなたは型について尋ねなかったが、intの代わりにssize_tを使用するのが技術的に正しい。

+0

'size_t 'を使用することも許容されます(実際には' std :: string'はこれを実際に行います) –

+0

ちょうど ' size_tは、 '--i'をループに使用すると、例えば0まで下がると爆発し、もう1回は実行され、負の' size_t'は非常に悪いものを作り出しています。また、 'auto'はこれを何にするでしょうか? – deW1

+0

「おばあちゃんが車輪を持っていたら、彼女はワゴンになるだろう」 - スコット、スタートレック3世。ここにはどこにでも '--i'はありません。 –

1

別の解決策は、端から後方ループにあり、あなたのcharの最初の発生時に停止:リバースイテレータとstd::findについて

int reverse_find_character(const char s[], char c){ 
    for (int i = strlen(s)-1; i>=0; --i) 
     if (s[i] == c) 
      return i; 
    return -1; 
} 
1

何。次に、std::distanceを使用してインデックスを取得します。

#include <algorithm> 
#include <iostream> 

using namespace std;  

int main() 
{ 
    const char str[] = "helloe"; 

    auto it = std::find(crbegin(str), crend(str), 'e'); 

    cout << std::distance(cbegin(str), (it + 1).base()) << '\n'; 
} 
+1

このコードは、C++ 14が使用されていることを前提としています。以前のバージョンでは、 'std :: reverse_iterator'を直接使うことも、' std :: find_end() 'を使うこともできます。 –

関連する問題