如何检查输入值是否在C++中有效值
我检查了Stack和其他站点上的很多链接。它大部分是做它应该做的事情,但不是“完全”我想做什么。这是我在网上找到的问题和最佳解决方案。 我想输入一个数字,例如浮点数和输入应该检查,如果是浮动或不。 我正在使用这个在线发现的代码片段。另外要提到的是,我需要重复验证,每次迭代它的循环。“n”在这个函数之前单独输入,并且它在“private”中。它完美地完成了它的工作,除非...如果输入“55”(号码),它会检查并验证。没关系。 如果您输入“dfgfd”(不是数字),它会检查并重复提问。没关系。 如果您输入“dfgdfgdg55”,它将检查并重复提问。这也没关系。如果你输入“55dfgfd”的东西,它会检查并不重复。这是不正确的。它只是丢弃数字后的字符。我也想丢弃这个。所以正确的输入应该是只输入“55”(数字55只是提示时输入的示例数字)。我也尝试了一个更简单的函数“模式”。首先输入“55”,然后输入“55gdf”。他们在屏幕上呈现为“55”和“55”。然后我添加了一些代码来比较这些数字。他们是不一样的!如何检查输入值是否在C++中有效值
#include <iostream>
using namespace std;
int Provera_kucanja()
{
cout<<endl;
cout<<"Input boundary for an array"<<endl;
cin>>n;
while (cin.fail() || !(n>0))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout<<"You didnt entered number, please try again... "<<endl;
cin>>n;
}
cout<<endl;
return 0;
}
float Unos_brojeva()
{
cout<<"\n";
cout<<"Now you must enter number into array:\n "<<endl;
for (int i = 0; i < n ; i++)
{
cout<<"Input "<<"["<<i<<"]"<<" number in array: ";
float r;
cin>>r;
while (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout<<"You didnt entered number, please try again... "<<endl;
cout<<"Input "<<"["<<i<<"]"<<" number in array: ";
cin>>r;
}
unos[i]=r;
}
cout<<endl;
cout<<"Now show unsorted array members: "<<endl;
for(int i = 0; i < n; i++)
{
cout<<"This is "<<"["<<i<<"]"<<" member of array named 'unos': "<<unos[i]<<endl;
}
cout<<"\n"<<endl;
cin.get();
return 0;
}
int main(){
Provera_kucanja();
Unos_brojeva();
}
在使用建议答案的方面是,当用户输入像“ghfg”这样的东西时,这个转换的结果是一个ZERO !.所以建议的答案是没有去的。
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int main()
{
string A_number;
char* An_array=new char[A_number.length()];
cout<<"Enter value for A_number: ";
cin>>A_number;
strcpy(An_array,A_number.c_str());
float n=atof(An_array);
cout<<"Value entered is: "<<n;
cin.get();
return 0;
}
听起来像是你想输入作为字符串(也可能是整行)读取,然后你可以测试这些字符串你喜欢的任何方式。
我只是想检查它的输入值是否是一个数字。正如我上面所说的“55”只是正确的答案。不是“sdfsf55”的“55fddfg”或只是“dgfg”。所以只需检查输入值是否为CLEAN NUMBER而没有别的。例如,如果你输入“55dgfdf”它显示为数字55.检查必须完成。只有数字应输入。 – 2014-08-30 23:00:54
是否有可能进行完整的输入检查?链接或答案请帮忙 – 2014-08-30 23:02:34
行:
cin >> r
会尝试读取一个有效的浮动,即使是坏后尾随的信息。
你说当有人输入55x
时会出现问题,在这种情况下,你认为它不应该被认为是一个有效的数字。
有一个答案,你的问题就在这里:https://stackoverflow.com/a/19717896/312594
你要做的就是阅读作为一个字符串的全部数据,并确认是可能的浮动输入(digits
,.
,+
只有字符是什么, -
等)在输入中,并且按照正确的可能顺序。只有在验证输入后,才会将输入转换为浮点数(通过cin
或其他某种机制)。
在大多数情况下,您应该接受55x为55,因为这可能是用户想要的,但如果您确实想要严格,则必须自己执行附加验证。
p.s. - 我几乎不喜欢这样说,因为我不想听起来有偏见,但是当你学习C++时,你可能会发现用英文编写你的所有代码(包括提示)是有用的。如果您稍后在StackOverflow上寻求帮助,那么对于更多人来说,了解您正在尝试做什么并因此帮助您更容易。
对不起,我现在编辑提示。 – 2014-08-30 23:51:09
所以基本上我需要输入值到字符串类型变量,然后将其转换为浮动?我只是不想做任何形式的转换,只是检查值是否是正确的类型。 – 2014-08-31 00:07:55
这是一种方法,是的,但它也是很多工作,*和*你可能是错的。用户可能知道你的程序会要求输入一个数字然后输入一个字符串,然后输入55x。你的程序很简单,但在某些情况下可能是正确的。在55x的情况下,cin会将55放入r中,并且您应该假设这是正确的。在你的循环的下一次迭代中,你的代码将看到x,*然后*它应该返回一个错误并声明无效输入。换句话说,不要试图纠正所有可能的*未来*错误。如果你期望float * now *,那么查找带有cin >> r的float。那有意义吗? – par 2014-08-31 02:05:40
确切的问题是,当我输入55ffghfg的东西是“ffghfg”传递给数组中的下一个成员作为一个值,因此这种行为导致那是第一个数字是55(多数民众赞成),但创建错误,它重复输入下一个成员,即使这个数字还没有输入! – 2014-08-30 23:23:56
这就是'cin'所做的。它只是试图读取你要求的数据类型(在本例中为float),如果它得到一个,输入指针停留在输入数据的下一个字节。如果你想消耗行的其余部分,你需要读取一个字符串,直到包括换行符后,你得到你的浮动。 – par 2014-08-30 23:26:56
我刚刚将我的提示翻译成英文。 – 2014-08-30 23:57:53