2011-12-09 125 views
0

我需要驗證用戶的一個輸入字符串。最終它需要分解成兩個座標。即a4 c3。一旦他們是座標,他們需要分解成4個獨立的整數。 a = 0 b = 1等。它們還必須遵循以下規定:輸入字符串驗證,無需C++的外部庫

如果達到輸入結束信號,則程序退出。 否則,將從輸入中丟棄所有非字母數字字符。 如果剩下的是單個字母'Q' 然後程序退出。 如果剩下的內容由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. while循環將永遠不會結束,因爲你在退出設置goodInputfalse這讓循環繼續。

  2. 該代碼可能甚至沒有編譯?你缺少一個花右括號..

  3. 要初始化pair1pair2爲空字符串,但從來沒有再次更改,所以他們絕不會包含有關移動的任何真實信息

  4. 也許你真的很想把rawMove分成pair1pair2子串嗎?

0

由於這是一門功課 - 而你應該從那些(對不對?)學習 - 我不會給你完整的答案,而是像一個偏方:

  • 使用std::istream::getline(char*, std::streamsize s)std::cin中讀取整行。確保分配足夠大的緩衝區以保存預期的輸入(包括終止的null字符)以及一些無效字符。通話結束後,請檢查failbit(輸入太長)和數據流的eofbit(命中輸入結束)並處理這些情況。如果沒有錯誤或尚未達到EOF,則從緩衝區構建std::string

  • 寫字符分類功能(例如稱之爲isAlNum(char c))返回true如果char參數是字母數字,並false否則。

  • 結合std::string::erase()std::remove_if()std::not1()std::ptr_fun()和你的函數isAlNum()消毒輸入字符串。

  • 編寫一個函數,用於驗證和分析來自已清理的輸入字符串的座標,並使用已清理的輸入字符串調用它。

  • 將整個東西包裝在合適的while()循環中。

這應該讓你開始正確的方向。當然,如果您被允許使用C++ 11功能,並且您知道如何編寫好的正則表達式,那麼請務必使用<regex>標頭,而不是手動進行解析。