2017-09-18 23 views
-2

仕事のために文字検索を取得できません。 substring関数が機能していますが、char型の検索は、文字列内の文字を検索するに文字列内の文字を検索

#include<iostream> 
#include <string> 

using namespace std; 

int charsearch(string searchInto, char ch, int start = 0) 
{ 
    int x = 0; 
    long n = searchInto.length(); 
    for (int i = 1; i < n; i++) 
    { 
     cout << ch; 
     if (searchInto[i] == ch) 
     {  
      i = x; 
     } 
     else 
      i++; 
    } 
    cout<< x; 
    return x; 
} 

int substr(string src, string tosearch, int start = 0) 
{  
    string searchInto = src; 
    long n = searchInto.size(); 
    long m = tosearch.size(); 
    int ans = -1; 

    for (int i = start; i < n; ++i) 
    { 
     int p = i; 
     int q = 0; 
     bool escape = false; 
     while (p < n && q < m) { 
      if (searchInto[p] == tosearch[q]) { 
       if (tosearch[q] == '/' && !escape) { 
        ++q; 
       } else { 
        ++p; ++q; 
       } 
       escape = false; 
      } else if (!escape && tosearch[q] == '*') { 
       ++q; 
       while (q < m && p < n && searchInto[p] != tosearch[q]) ++p; 
       escape = false; 
      } else if (!escape && tosearch[q] == '?') { 
       ++p; ++q; 
       escape = false; 
      } else if (tosearch[q] == '/' && !escape) { 
       escape = true; 
       ++q; 
      } else break; 
     } 

     if (q == m) { 
      return i; 
     } 

     if (q == m - 1 && tosearch[q] == '*') { 
      if (q > 0 && tosearch[q - 1] == '/') continue; 
      else return i; 
     } 
    } 
    return ans; 

} 

int main() 
{ 
    string searchInto, tosearch; 
    cout<< "Enter string:"; 
    getline(cin, searchInto); 
    cout << "Looking for :"; 
    getline(cin, tosearch); 
    if (tosearch.length() < 2) 
    { 
     char ch = tosearch.at(0); 
     cout << "Found at: " <<charsearch(searchInto, ch) << endl; 
     cout << "Used Char" << endl; 
    } 
     else 
     cout << "Found at: " <<substr(searchInto, tosearch) << endl; 
    return 0; 
} 
+2

検索の実装で開始パラメータが無視されることに注意してください。 –

答えて

2

を探している文字の右の場所を提供することはありません、次の2つのインタフェースを持っています。

  1. std::string::findあなたが見つけるの文字の位置を返します:文字が存在しない場合は、std::string::npos位置について返さstd::size_tとして返されます

    auto pos = yourStr.find('h'); 
    char myChar = yourStr[pos]; 
    

を。

イテレータを返す algorithmヘッダ内
  • stl algorithm std::find、:その後it == yourStr.end()

    auto it = std::find(yourStr.begin(), yourStr.end(), 'h'); 
    char myChar = *it; 
    
  • 文字が存在しない場合、。

    +1

    文字列にそのような項目が存在しない場合に何が起こるかを説明すると便利です。 'std :: string :: find'は' std :: string :: npos'を返し、 'std :: find'は' yourStr.end() 'を返します。 'char myChar = yourStr [pos]'のように、結果を使用する前にこれら2つのうちの1つをチェックすることが必須です。 – Fureeish

    1

    CharSearchメソッドにはいくつかの間違いがあります。まず第一に、あなたはあなたの目標キャラクターを持っているときにループを壊さなければなりません。そして、最も重要なのは、ターゲットを見つけるときにxを割り当てていないことです。さらに、ループ内には値iの余分な増分があります。私はその機能を変更しました。あなたはどちらか、文字列で検索するstringまたはalgorithmstd::findfind方法を使用することができ、ことに注意してください

    int charsearch(string searchInto, char ch, int start = 0) { 
    
        int x = -1; 
        long n = searchInto.length(); 
        for (int i = start; i < n; i++) 
        { 
         cout << ch; 
         if (searchInto[i] == ch) 
         { 
    
          x = i; // previously written as i = x which is wrong 
          break; // loop should break when you find the target 
         } 
        } 
    
        cout<< x; 
        return x; 
    } 
    

    の下にそれを確認してください。この関数は第一試合を返します。

    +0

    ループは、要求された 'start'インデックスから開始する必要があります。そして、一致が見つからない場合、 'x'は0ではなく-1で初期化する必要があります。 –

    +0

    はい、そうです。編集されました。 –

    -1

    あなたはこのコード

    int charsearch(string searchInto, char ch, int start = 0) 
    { 
        int x = -1; // : change, if return -1, means not found 
        long n = searchInto.length(); 
        for (int i = start; i < n; i++) // : change 
        { 
         cout << ch; 
         if (searchInto[i] == ch) 
         { 
          x = i; // : change 
          break; // : change 
         } 
        } 
        cout<< x; 
        return x; 
    } 
    

    注につきなどの変更を加える必要があります。