如何在c ++中检查输入的值是否为有效值

时间:2014-08-30 22:32:17

标签: c++ arrays validation input iostream

我检查了Stack和其他网站上的许多链接。它大部分都是应该做的,但不是"确切地说"我多么想要。这是我在网上找到的问题和最佳解决方案。 我想输入一个数字,例如浮点数,如果是浮点数,则应检查输入。 我正在使用在线发现的这个代码段。还要提一下,我需要每次重复验证循环迭代。" n"在此功能之前单独输入,并且在" private"。它完美地完成其工作,除了...如果您输入" 55" (数字),它检查和验证。没关系。 如果你输入" dfgfd"东西(不是数字),它检查并重复问题。没关系。 如果输入" dfgdfgdg55",它会检查并重复问题。它还可以。如果你输入" 55dfgfd"东西,它检查,而不是重复。那不行。它只是在数字后丢弃字符。我也想丢弃它。所以正确的输入应该只是" 55"输入。(编号55只是提示时输入的示例编号)。我也尝试使用更简单的功能"型号"。先输入" 55",然后输入" ; 55gdf&#34 ;.它们在屏幕上显示为" 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();
          }

在使用建议答案的情况下,当用户输入类似&#34; ghfg&#34; ,这个转换的结果是零!所以建议的答案是禁止的。

#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;
}

2 个答案:

答案 0 :(得分:0)

该行:

cin >> r

将尝试读取有效的float,即使后面有错误的尾随信息。

您说当有人输入55x时会出现问题,在这种情况下,您认为不应将其视为有效号码。

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

您需要做的是以字符串形式读取整个数据并确认只有可能作为浮点输入的字符(digits.+,{{1在输入中,并以正确的顺序。只有在验证输入后,才会将输入转换为float(通过-或其他一些机制)。

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

P.S。 - 我几乎不想这样说,因为我不想听起来有偏见,但是当你学习C ++时,你可能会发现用英语编写所有代码(包括提示)很有用。如果您稍后在StackOverflow上寻求帮助,那么更多人会更容易理解您要做的事情,从而帮助您。

答案 1 :(得分:-1)

听起来你想在输入中读取字符串(或可能是整行),然后你可以按照自己喜欢的方式测试这些字符串。