gpt4 book ai didi

c++ - 如何阻止整数变量接受双输入(小数点前的数字)和任何其他值?

转载 作者:太空狗 更新时间:2023-10-29 21:14:47 25 4
gpt4 key购买 nike

如果我将任何带字符的 double 或整数作为最后一个可变 e 的输入,为什么 .fail() 不起作用?

我已经为这个问题添加了一些输出图片。

Output sample

代码:

int main() {
string a,b,line;
double c;
int d,e;
stringstream ss;
getline(cin,line);
ss<<line;
ss>>a>>b>>c>>d>>e;
cout<<"command: "<<a<<endl<<"arg1: "<<b<<endl<<"arg2: "<<c<<endl<<"arg3: "<<d<<endl<<"arg4: "<<e<<endl;
if(ss.fail())
cout<<"Error: invalid command"<<endl;
else
cout<<"perfect"<<endl;
return 0;
}

我该如何解决这个问题?

最佳答案

>>> 一旦发现无法解析为它被告知要读入的任何数据类型的输入,就会停止读取。将 7.5 读入 int 的输入是完全可以接受的 7,而不能成为 int 一部分的 .5 会留在流中以干扰下一次读取流。如果 OP 为第三个参数 (int d) 输入 7.5,则将 .5 读取到第四个参数 (int e) 将失败。

啊。完全忽略了如何修复部分。

我个人的偏好是将所有数据作为字符串读取并自己解析。在这种情况下,我会使用 good ol' strtol ,主要是因为我还没有对在错误的用户输入上抛出异常的想法产生兴趣。错别字时有发生。他们经常碰巧是异常(exception)。处理它。

所以我们会读入 std::string e,而不是 int e 然后...

char * endp; // strtol will point endp to character that ended the parsing. 
// If that's not the end of the string there was stuff we couldn't parse
errno = 0; // clear the error code so we can catch an overflow error
// if the number parsed was too big
long num = std::strtol(e.c_str(), &endp, 10); // parse the string as a decimal number
if (*endp != '\0' || errno == ERANGE)
{
// handle error. Abort, nag user and repeat, whatever
}
// use num

OP 补充说他们不允许使用 C 库调用。随它吧。 C++ library equivalent is std::stoi.我对上述异常的提示解释了为什么我不喜欢这个选项,但我们开始吧!

size_t end; 
int num = std::stoi(e, &end); // parse the string as a decimal number
if (end != e.length())
{
// handle error. Abort, nag user and repeat, whatever
}
// use num

如果转换完全失败,std::stoi 将抛出 std::invalid_argument。如果提供的数字太大,它会抛出 std::out_of_range,因此要么捕获并处理异常,要么让程序中止。你来电。

关于c++ - 如何阻止整数变量接受双输入(小数点前的数字)和任何其他值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39887496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com