2011-12-09 40 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>标头,而不是手动进行解析。