没有用于c ++的外部库的输入字符串验证

时间:2011-12-09 01:29:21

标签: c++ validation

我需要验证用户的一个输入字符串。最终它需要分解成两个坐标。即a4 c3。一旦它们成为坐标,就需要分成4个单独的整数。 a = 0 b = 1等。他们还必须遵守以下规定:

如果到达输入结束信号,程序退出。 否则,将从输入中丢弃所有非字母数字字符。 如果剩下的是单个字母'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具有各自的值。

请记住,我不允许拥有任何外部库。

2 个答案:

答案 0 :(得分:1)

目前尚不清楚您想要实现的目标,但这里有一些指导可以帮助您入门:

  1. while循环永远不会结束,因为您在退出时将goodInput设置为false,这样可以让循环继续。

  2. 代码可能甚至没有编译?你错过了一个大括号......

  3. 您正在初始化pair1pair2以清空字符串但从不再更改它们,因此它们永远不会包含有关您的移动的任何真实信息

  4. 或许你真正想要的是先将rawMove分成pair1pair2子串?

答案 1 :(得分:0)

因为这是一个家庭作业 - 而你应该向他们学习(对吗?) - 我不会给你完整的答案,而是像食谱一样:

  • 使用std::istream::getline(char*, std::streamsize s)std::cin读取整行。确保分配足够大的缓冲区来保存预期的输入(包括终止null字符)以及更多的无效字符。通话结束后,检查failbit(输入太长)和eofbit流的std::cin(点击输入结束)并处理这些情况。如果没有错误或未达到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>标头而不是手动进行解析。