2014-08-30 198 views
0

我检查了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; 
} 
+0

确切的问题是,当我输入55ffghfg的东西是“ffghfg”传递给数组中的下一个成员作为一个值,因此这种行为导致那是第一个数字是55(多数民众赞成),但创建错误,它重复输入下一个成员,即使这个数字还没有输入! – 2014-08-30 23:23:56

+0

这就是'cin'所做的。它只是试图读取你要求的数据类型(在本例中为float),如果它得到一个,输入指针停留在输入数据的下一个字节。如果你想消耗行的其余部分,你需要读取一个字符串,直到包括换行符后,你得到你的浮动。 – par 2014-08-30 23:26:56

+0

我刚刚将我的提示翻译成英文。 – 2014-08-30 23:57:53

回答

-1

听起来像是你想输入作为字符串(也可能是整行)读取,然后你可以测试这些字符串你喜欢的任何方式。

+0

我只是想检查它的输入值是否是一个数字。正如我上面所说的“55”只是正确的答案。不是“sdfsf55”的“55fddfg”或只是“dgfg”。所以只需检查输入值是否为CLEAN NUMBER而没有别的。例如,如果你输入“55dgfdf”它显示为数字55.检查必须完成。只有数字应输入。 – 2014-08-30 23:00:54

+0

是否有可能进行完整的输入检查?链接或答案请帮忙 – 2014-08-30 23:02:34

0

行:

cin >> r

会尝试读取一个有效的浮动,即使是坏后尾随的信息。

你说当有人输入55x时会出现问题,在这种情况下,你认为它不应该被认为是一个有效的数字。

有一个答案,你的问题就在这里:https://stackoverflow.com/a/19717896/312594

你要做的就是阅读作为一个字符串的全部数据,并确认是可能的浮动输入(digits.+只有字符是什么, -等)在输入中,并且按照正确的可能顺序。只有在验证输入后,才会将输入转换为浮点数(通过cin或其他某种机制)。

在大多数情况下,您应该接受55x为55,因为这可能是用户想要的,但如果您确实想要严格,则必须自己执行附加验证。

p.s. - 我几乎不喜欢这样说,因为我不想听起来有偏见,但是当你学习C++时,你可能会发现用英文编写你的所有代码(包括提示)是有用的。如果您稍后在StackOverflow上寻求帮助,那么对于更多人来说,了解您正在尝试做什么并因此帮助您更容易。

+0

对不起,我现在编辑提示。 – 2014-08-30 23:51:09

+0

所以基本上我需要输入值到字符串类型变量,然后将其转换为浮动?我只是不想做任何形式的转换,只是检查值是否是正确的类型。 – 2014-08-31 00:07:55

+0

这是一种方法,是的,但它也是很多工作,*和*你可能是错的。用户可能知道你的程序会要求输入一个数字然后输入一个字符串,然后输入55x。你的程序很简单,但在某些情况下可能是正确的。在55x的情况下,cin会将55放入r中,并且您应该假设这是正确的。在你的循环的下一次迭代中,你的代码将看到x,*然后*它应该返回一个错误并声明无效输入。换句话说,不要试图纠正所有可能的*未来*错误。如果你期望float * now *,那么查找带有cin >> r的float。那有意义吗? – par 2014-08-31 02:05:40

相关问题