【发布时间】:2014-10-24 14:07:08
【问题描述】:
我检查了 Stack 和其他网站上的许多链接。它的大部分都做了应该做的事情,但不是“完全”我想要的。这是我在网上找到的问题和最佳解决方案。 我想输入一个数字,例如浮点数,并且应该检查输入是否是浮点数。 我正在使用在网上找到的这个 sn-p。还要提一下,我每次都需要重复验证循环它的迭代。“n”在这个函数之前单独输入,它在“私人”中。它完美地完成了它的工作,除了......如果你输入“55”(号),它检查和验证。没关系。 如果您输入“dfgfd”内容(不是数字),它会检查并重复问题。没关系。 如果您输入“dfgdfgdg55”,它会检查并重复问题。也没关系。如果你输入“55dfgfd”的东西,它会检查而不是重复。这不行。它只是在数字之后丢弃字符。我也想丢弃它。所以正确的输入应该只输入“55”。(数字55只是提示时输入的示例数字)。我也在一个更简单的函数上尝试了这个“model”。先输入“55”,第二输入“55gdf”。它们在屏幕上显示为“55”和“55”。然后我添加了一些代码来比较这些数字。它们不一样!
#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”之类的内容时,此转换的结果为零!。所以建议的答案是不可行的。
#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;
}
【问题讨论】:
-
确切的问题是当我输入 55ffghfg 时,“ffghfg”作为值传递给数组中的下一个成员,因此这种行为导致第一个数字是 55(没关系),但会产生错误即使没有为该号码输入任何内容,它也会为下一个成员重复输入!
-
cin就是这样做的。它只是尝试读取您要求的数据类型(在本例中为浮点数),如果它得到一个,则输入指针将停留在输入数据的下一个字节。如果您想消耗该行的其余部分,您需要在获得浮点数后读取一个字符串,直到并包括换行符。 -
我刚刚将提示翻译成英文。
-
@VeljkoStefanovic 我在这里写了一个解决这个问题的答案——stackoverflow.com/questions/23583733/…
-
刚才看到了。仅提取字符串的可用部分,丢弃其余部分。然后将其余部分用于下一个输入,然后 while 循环再次丢弃其余部分,现在您可以为循环的第二次迭代输入有效输入。我希望它可以丢弃所有这些,而不是将字符串的垃圾部分转移到下一次迭代,但这是规则。
标签: c++ arrays validation input iostream