在SFML的TGUI库中验证输入

时间:2017-04-13 01:47:29

标签: c++ sfml

我有一个窗口,我有几个文本框,人们可以进入他们的  名字,年龄,性别,工作和任何当前的疾病,并将其保存到文本文件中。

我使用SFML制作窗口,处理背景和其他菜单内容以及文本框的TGUI库。

按照TGUI网站上的教程,我可以从一个框中获取文本并将其转换为字符串并使用,例如:

myfile << Job->getText().toAnsiString() << std::endl;

但是,我需要验证输入,使得name只有一个单词,没有特殊字符或数字,Age只是一个+ ve int,没有空格或特殊字符等等......

我该怎么做呢?在我的新手心中,对于&#34;年龄&#34;例如,我能想到的是拥有一个特殊字符数组和[A-Z]和[a-z],并使用for循环将字符串中的每个元素检查到数组中的每个元素。但这似乎效率很低。

2 个答案:

答案 0 :(得分:1)

一种方法是在每个字符串中运行for循环,并检查每个字符是否只在所需字符的ASCII范围内。

例如,如果您希望名称仅包含大写字母,则可以键入:

for(int I=0; I<name.length(); I++)
{
    if(!(name[I]>64 && name[I]<92))
    {
        cout << "Bad Name"
        flag = false;
    }
}
if(flag)
{
    cout << "Name is valid";
}

查找ASCII值图表,查看哪些字符位于哪个范围内。

如果这回答了您的问题,请将其标记为您的答案!希望这会有所帮助。

答案 1 :(得分:1)

有两种方法可以做到这一点。 要限制编辑框中的可接受字符,您只需使用指定可接受输入的setInputValidator function即可。如果您只希望用户键入数字,则只需调用以下函数:

editBox->setInputValidator(tgui::EditBox::Validator::UInt);

setInputValidator函数可以将正则表达式字符串作为参数,因此验证程序可以像您想要的那样复杂。

第二种方法是事后手动进行验证(通过Henri Prudhomme's answer中的所有字符)。这样,您可以允许用户在编辑框中键入不正确的内容,然后例如更改编辑框的颜色以指示该值无效。

在更复杂的情况下,第二种方式更好。想象一下,您希望将输入限制在10到20之间的数字。您可以使用setInputValidator中的正则表达式执行此操作,但是当用户开始键入1并打算在其后键入另一个数字时,输入被拒绝,编辑框中没有添加任何内容。在这种情况下,最好的方法可能是两种方式的组合,让setInputValidator过滤掉所有非数字输入,然后手动验证该数字是否在所需范围内。