我需要验证用户的一个输入字符串。最终它需要分解成两个坐标。即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具有各自的值。
请记住,我不允许拥有任何外部库。
答案 0 :(得分:1)
目前尚不清楚您想要实现的目标,但这里有一些指导可以帮助您入门:
while循环永远不会结束,因为您在退出时将goodInput
设置为false
,这样可以让循环继续。
代码可能甚至没有编译?你错过了一个大括号......
您正在初始化pair1
和pair2
以清空字符串但从不再更改它们,因此它们永远不会包含有关您的移动的任何真实信息
或许你真正想要的是先将rawMove
分成pair1
和pair2
子串?
答案 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>
标头而不是手动进行解析。