1

私のプロジェクトでは、ユーザーから文字列を取得し、母音a、e、I、O、Uが存在するかどうかを確認する必要があります。もしそうなら、私はどれが文字列の最初に来て、どれがその後に来るかを見つけなければなりません。たとえば、ユーザーが次のような入力を行った場合:

char expr[] = "this is for something real";

私が最初に来て、次に私が再び来て、次にOというように続きます。文字列に文字が含まれているかどうかを確認しましたstrchr(expr,'character here')。どの文字が最初に来るかを見つけるために、私は使用して各文字のインデックスを見つけます

const char *ptr = strchr(expr, characters here);
if(ptr) {
    int index = ptr - expr;
}

その後、どちらのインデックスが大きいかを確認します。しかし、これは非常に長いプロセスです。これを行うためのよりスマートな方法はありますか?

4

3 に答える 3

1

元の文字列の位置が必要ではなく、順序のみが必要な場合は、std::remove_copy_if母音以外の文字を検出するファンクターを使用できます (つまり、母音に対して true を返します)。

 std::string only_vowels;
 std::remove_copy_if( std::begin(expr), std::end(expr),
                    std::back_inserter(only_vowels),
                    []( char ch ) { char upper = toupper(ch);
                                    return upper!='A' 
                                          && upper!='E'
                                          && upper!='I'
                                          && upper!='O'
                                          && upper!='U'; } );

(C++11 の機能を使用して、ファンクターを作成する代わりにイテレーターとラムダを取得しますが、C++03 で同じことを少し余分なボイラー プレート コードで記述できます。コードはテストされていません)

アルゴリズムが完了only_vowelsすると、元の文字列に存在する母音のみが、出現した正確な順序で含まれます。大文字と小文字はアルゴリズムによって変更されません。

または、文字列内の要素を手動で反復し、各文字をテストして母音かどうかを確認し、それを印刷するか、必要なことを何でも行うことができます。これが宿題である場合、これはおそらくあなたに期待されていることです。

于 2012-06-20T03:12:34.377 に答える
1

これは、入力式を反復処理し、対象の文字が検出されたときに注目するだけで、非常に簡単に実行できます。入力式に見られる順序で母音をC++11aに入力する方法を次に示します。std::vectorそれらを印刷する必要がある場合は、ベクターを埋めないでくださいresults(代わりに印刷してください)。

char expr[] = "this is for something real";
std::vector<char> results;

std::for_each(
    expr,
    expr + strlen(expr),
    [&results] (const char c)
{
   switch(c)
   {
   case 'a':
   case 'A':
   case 'e':
   case 'E':
   case 'i':
   case 'I':
   case 'o':
   case 'O':
   case 'u':
   case 'U':
      results.push_back(c);
   }
});
于 2012-06-20T02:56:16.220 に答える
0

これは、見つかった文字とインデックスを (自動的に順番に) 提供するメソッドです。また、C ではなく、いくつかの C++ 機能を利用します。

int main() {
    std::string expr = "this is for something real";
    std::string toCheck = "AaEeIiOoUu"; //checking for these letters
    std::map<int, char> indices; //stores index-character pairs

    for (char c : toCheck) { //go through each char in string (ranged-for, C++11)
        if (expr.find (c) != std::string::npos)
            indices [expr.find (c)] = c; //map sorts itself by key
    }

    for (const auto &element : indices) { //print results
        std::cout << "'" << element.second << "'" 
            << " found at index " << element.first << '\n';
    }
}

Davidの回答よりも必要なものが他にあるかどうかはわかりませんが、それを行う1つの方法であり、より多くの情報を引き出すことができます. ただし、現在のコードでは、それぞれの最初のオカレンスのみが提供されます。すべてが必要か最初が必要かはわかりませんが、順応性があります。ただし、その時点で、David の答えは非常にうまく適合します。

于 2012-06-20T03:19:22.670 に答える