我正在开发一个需要检查输入正确的项目(n),我目前有一些代码不允许输入字符串,因为它会再次询问正确的数量。我在编写一个不允许浮点数通过的代码时遇到了麻烦,因为它当前只是忽略了输入的float部分。如果这是一个简单的问题,我很抱歉,但我还没有办法解决这个问题。
for(int i=0; i<1; ++i)
{
string b1;
int e;
do
{
getline(cin,b1);
e=atoi(b1.c_str());
}
while(e==0 && b1!="0");
n=e; // where n is the user input
}
答案 0 :(得分:1)
假设您考虑使用小数点('.'
)或使用带有负指数的科学记数法作为不可接受的浮点数,只需检查输入的字符串是否包含其中一个:
std::string::iterator it;
if (b1.end() != std::find(b1.begin(), b1.end(), '.')
|| (b1.end() != (it = std::find_if(b1.begin(), b1.end(),
[](char c){ return c == 'e' || c == 'E'; })
&& it + 1 != b1.end()
&& '-' == it[1])) {
// deal with the string being a floating point number with a fractional part
}
请注意,这会将"10e-1"
视为错误值,尽管它实际上只是"1"
的奇特拼写。
答案 1 :(得分:0)
如果您输入float
值,则会有decimal point (.)
。由于您的输入是string
,因此您可以执行以下检查: -
do
{
getline(cin,b1);
if(bi.find(".")!=b1.npos); // search if a decimal point is present or not
cout<<"wrong input";
else
e = stoi(b1); // stoi works similar to atoi but on strings
}
答案 2 :(得分:0)
您可以将MessageEventArgs me = new MessageEventArgs();
me.weekNo = k;
me.DayNo = i;
OnMessageSending(me);
用于此目的: -
std::stringstream
答案 3 :(得分:0)
你要做的第一件事就是不要一遍又一遍地重复代码来读取整数。做一个功能:
int getInt(std::istream & in)
这将采用任何输入流cin
,文件,std::stringstream
等等。接下来,我们设置了一些我们需要的局部变量。
{
std::string b1;
int e;
现在我们构建输入循环
while (std::getline(in, b1))
这将循环直到输入流失败。如果它永远不会失败并且用户无法完成他们的行为,那么我们将在这里待很长时间。与吉利根。船长也是。也许我们可以从豪威尔先生那里掏出一些开办种子资金的钱,嗯?
{
size_t pos;
捕获字符串-to-int转换引发的任何异常
try
{
转换为int
。将使用结束转换的字符更新pos
。如果它不是字符串的结尾,则该字符串不包含int
。如果它包含int
,我们退出该函数并返回int
。
e = std::stoi(b1, &pos);
if (pos == b1.length())
{
return e;
}
}
我们真的不需要在catch区块做任何事情。如果您愿意,可以输出消息来指导或模仿用户。
catch (...)
{
}
}
如果我们到这里,IO流失败了,我们需要让人们知道。抛出异常。
// IO failure. throw exception
}
用法很简单:
int value = getInt(cin);
您可能希望将调用包装在try-catch块中以捕获IO失败异常。 cin
的失败案例非常奇怪,但通常是致命的。
在文件上调用getInt
时,您需要更仔细地处理事情,因为文件末尾很常见。
所有人都没有正在进行的评论:
int getInt(std::istream & in)
{
std::string b1;
int e;
while (std::getline(in, b1))
{
size_t pos;
try
{
e = std::stoi(b1, &pos);
if (pos == b1.length())
{
return e;
}
}
catch (...)
{
}
}
// IO failure. throw exception
}