2016-10-18 20 views
1

私は、ユーザーから与えられた文字列を反復処理する方法を考えています。サイコロの動きと関係があります。フォーマット:xdy [z]ここで、xは時間が丸められ、dyはダイスタイプであり、zは整数です。文字列を繰り返すC++

形式は次のとおりです.1999(x)の数字、次にdと特定の数字[ダイスタイプ](4,6,12,20,100から選んだ5つだけ)、そして1から100までの数字の角かっこ...など、いくつかの例はこのように見えます... 1d4 [57] 、889d20 [42]、43d4 [4]、1d4 [1] - 999d100 [100]は6文字と12文字の間の文字の範囲です。私はこれについてどうやって行くのか分からない、今ここにいるものがあるが、これについてもっと良い方法があるようだ。ユーザーから受け取った入力は、正規表現を使用して検証されており、形式が正しいことを確認します。私はベクトル配列に値を格納し、最後にすべてを連結したいと考えました。

void rollDie(std::string input) 
{ 
    int bracketCount; 
    std::vector<int> timesRolled; 
    std::vector<int> diceType; 
    std::vector<int> additional; 
    bool d = false; 
    bool bc = false; 

    for (int i = 0; i < input.length; i++) //or length - 1 
    { 
     if (isdigit(input[i])) 
     { 
      if (bool d = false) 
      { 
       timesRolled.push_back(input[i]); 
      } 
     } 
     if(isalpha(input[i])) 
     { 
      d = true; 
     } 
     if (isdigit(input[i])) 
     { 
      if (d = true) 
      { 
       diceType.push_back(input[i]); 
      } 
     } 
     if (!isalpha(input[i]) && !isdigit(input[i])) 
     { 
      bracketCount++; 
      bc = true; 
      if (bracketCount = 2) break; 
     } 
     if (isdigit(input[i])) 
     { 
      if (bc = true) 
      { 
       additional.push_back(input[i]); 
      } 
     } 
    } 
} 
+2

''(D = TRUE)であれば、 ''(bracketCount = 2)の場合と '(BCは= TRUE)場合には'、おそらく正しいことができません。これらの 'if'チェックはすべて代入されており、新しい値が真理値であるかどうかをテストします(これはすべての場合に当てはまります)。 'if(d = false)'は同じですが、割り当てが偽であるため、テストは常に失敗します。 – ShadowRanger

+4

RegExを使用して検証する場合、正規表現を使用して数値を取得するのはなぜですか? – Elyasin

+2

以下の回答がうまくいかない場合は、フィードバックをお寄せください。それが動作する場合は、/ upvoteを受け入れてください。 –

答えて

3

正規表現を使用して入力を検証する場合は、同じ正規表現を使用して値を抽出することもできます。

何か等:

std::regex e{ R"-((\d{1,3})[Dd](4|6|12|20|100)\[(\d{1,3})\])-" }; 

    std::cout << "Enter dice roll: " << std::flush; 

    std::smatch m; 
    for(std::string line; std::getline(std::cin, line);) 
    { 
     if(std::regex_match(line, m, e)) 
      break; // if it's good we're done here 

     // keep going until we get it right 
     std::cout << "Error: bad format, please use: nnndxx[ddd]" << '\n'; 
    } 

    int rolls = std::stoi(m[1]); 
    int sides = std::stoi(m[2]); 
    int extra = std::stoi(m[3]); 

    std::cout << "Rolls: " << rolls << '\n'; 
    std::cout << "Sides: D" << sides << '\n'; 
    std::cout << "Extra: " << extra << '\n'; 
+1

これは私にとって理にかなっています!私はあなたと同じ正規表現を持っていましたが、式を検証するためだけに、再利用する方法がわからなかったので、ありがとう。 – lucyb

+1

私は質問がありますが、どのように私はあなたの文を壊すでしょうか?私は正しい値を得た後、私はいくつかの値を計算したいが、私はループに詰まっているので、私はそれを行うことができない – lucyb

+2

@lucyb私は答えを編集しました。単に 'break;'ステートメントを使います。 – Galik

関連する問題