2011-12-09 6 views
0

ユーザからの入力文字列を検証する必要があります。最終的には、2つの座標に分解する必要があります。すなわちa4 c3。そして、それらが座標になると、4つの別々のintに分割する必要があります。 a = 0 b = 1など。また、次の規則に従わなければなりません。C++の外部ライブラリを使用しない入力文字列の検証

終了信号に達すると、プログラムは終了します。 それ以外の場合、英数字以外の文字はすべて入力から破棄されます。 残っている場合は、単一の文字 'Q' です。その後、プログラムは終了します。 残っているものが最初の2文字のうちの1文字と1桁、最後の2文字のうちの1文字と1桁、それぞれの英数字の組がグリッドの有効範囲にある場合は、残りの文字は4文字で構成されます 次に入力受け入れられる。

私は完全に思考し、私の機能を台無しにしました。私がどこで訂正できるか教えてください。

データが有効である場合に限り、主に1つの文字列から4つの文字に進むのが難しいです。私が扱うことができる他のすべて。

これまで私がこれまで持っていたことは次のとおりです。

void Grid::playerMove() 
{ 
    string rawMove; 
    string pair1 = " "; 
    string pair2 = " "; 
    bool goodInput = false; 
    char maxChar = 'a'; 
    char chary1, chary2; 
    int x11,x22,y11,y22; 
    for (int i =0; i<size; i++) 
    { 
     maxChar++; 
    } 

    while(!goodInput) 
    { 
     cout<<"What two dots would you like to connect? (Q to quit) "; 
     cin>>rawMove; 
     rawMove = reduceWords(rawMove); 
     if (rawMove == "Q") 
     { 
      cout<<"end game"; 
      goodInput = false; 
     } 
     else if (rawMove.size() == 4) 
     { 
      for(int j=0;j<2;j++) 
      { 
       if (pair1[j] >='a' && pair1[j] <=maxChar) 
       { 
        chary1 = pair1[j]; 
       } 
       else if(pair1[j] >=0 && pairl[j]<=size+1) 
       { 
        x1 = pair1[j]; 
       } 
      } 
     for(int k=0;k<2;k++) 
     { 
      if (pair2[k] >='a' && pair2[k] <=maxChar) 
      { 
       chary2 = pair2[k]; 
      } 
      else if(pair2[k] >=0 && pair2[k]<=size+1) 
      { 
       x2 = pair2[k]; 
      } 
     } 
    } 
    if(char1 != NULL && char2 != NULL && x1 !=NULL && x2 != NULL) 
    { 
     for (int m = 0; m <= size m++) 
     { 
      if (char1 == m;) 
      { 
       x1 = m; 
      } 
     } 
     for (int n = 0; n <= size n++) 
     { 
      if (char2 == n) 
      { 
       x2 = n; 
      } 
     } 
    } 
} 

最後の目標は、それぞれの値でx1、x2、y1、およびy2を持つことです。

私は外部ライブラリを持つことはできません。

+4

私は ''を提案します。これは言語標準の一部です。 –

+0

普通の落とし穴チェックでは、 'cin'が空白で止まることに気づいていますか? 'reduceWords'とは何ですか、どのように定義されていますか? –

+0

これは今でもコンパイルできますか? Char1、Char2、x1、&x2はどこにも定義されていません(私が見ることができます)。 – Aaron

答えて

1

それはあなたが達成したい正確に何明確ではないのですが、ここであなたが始めるためにいくつかのポインタです:

  1. あなたがすることができますどの終了にfalsegoodInputを設定しているので、whileループを終了することはありませんループを続行します。

  2. コードはおそらくコンパイルされません。あなたは、文字列を空にしないが、決してそれらを再度変更するpair1pair2を初期化しているカーリー閉じ括弧..

  3. が欠落しているので、彼らはあなたの動きについての任意の実際の情報が含まれることはありません

  4. 多分何本当に欲しいのは、をpair1pair2部分文字列に分割することです。

0

これは宿題ですので - あなたはそれらの(右?)から学ぶことになっている - 私はあなたに完全な答えを提供するつもりではなく、レシピのようなものはないよ:

  • から1行全体を読むには、std::istream::getline(char*, std::streamsize s)を使用します。予想される入力(終了するnull文字を含む)と無効な文字を保持するのに十分な大きさのバッファを割り当ててください。コール後、std::cinストリームのfailbit(入力が長過ぎました)とeofbit(入力の最後をヒット)を確認し、そのようなケースを処理します。エラーがなかった場合、またはEOFに達していない場合は、バッファからstd::stringを構築します。

  • char引数がそうでなければ、英数字、およびfalseであればtrueを返す文字分類関数(例えばisAlNum(char c)それを呼び出す)書きます。

  • 入力文字列をサニタイズするstd::string::erase()std::remove_if()std::not1()std::ptr_fun()とあなたの関数isAlNum()を結合します。

  • 墨塗りされた入力文字列から座標を検証して解析し、墨塗りされた入力文字列で呼び出す関数を記述します。

  • ループ全体を適切なwhile()ループで囲みます。

これはあなたが正しい方向に始めるはずです。もちろん、C++ 11の機能を使用することが許可されていて、良い正規表現を書く方法を知っているならば、手動で解析する代わりに<regex>ヘッダーを使用してください。