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

C++ 如何在c+中检查输入的值是否为有效值+;,c++,arrays,validation,input,iostream,C++,Arrays,Validation,Input,Iostream,我检查了Stack和其他站点的许多链接。大部分都是按照我的意愿去做的,但并不是“完全”按照我的意愿去做。以下是我在网上找到的问题和最佳解决方案。 我想输入一个数字,例如float,并且应该检查输入是否为float。 我正在使用在线找到的这个片段。还需要提到的是,我需要在每次迭代循环时重复验证。在这个函数之前单独输入“n”,在“private”中输入“n”。它的工作做得很好,除了……如果输入“55”(数字),它会检查和验证。没关系。 若你们输入“dfgfd”内容(不是数字),它会检查并重复问题。没

我检查了Stack和其他站点的许多链接。大部分都是按照我的意愿去做的,但并不是“完全”按照我的意愿去做。以下是我在网上找到的问题和最佳解决方案。 我想输入一个数字,例如float,并且应该检查输入是否为float。 我正在使用在线找到的这个片段。还需要提到的是,我需要在每次迭代循环时重复验证。在这个函数之前单独输入“n”,在“private”中输入“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();
          }
#包括
使用名称空间std;
int Provera_kucanja()
{

cout听起来像是您希望以字符串(或可能是整行)的形式读取输入,然后您可以以任何方式测试这些字符串。

行:

cin>>r

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

您的意思是,当有人输入
55x
时会出现问题,在这种情况下,您认为不应将其视为有效数字

这里有您的问题的答案:

您需要做的是将整个数据作为字符串读取,并确认只有可能作为浮点输入的字符(
数字
+
-
,等等)在输入中,且顺序正确。只有在验证输入后,才能将输入转换为浮点(通过
cin
或其他机制)

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


S.S.我几乎不喜欢这样说,因为我不想听起来有偏见,但是当你学习C++时,你可能发现用英语写所有代码都是有用的,包括提示,如果你后来在STACKOFFAST上寻求帮助,那么更多的人会更容易理解你想要做的事情,因此帮助你。如果输入的值是一个数字,请勾选。正如我上面所说的,“55”是唯一正确的答案。不是“sdfsf55”的“55fddfg”或只是“dgfg”。因此,只需检查输入的值是否是一个干净的数字,而不是其他任何数字。例如,如果输入“55dgfdf”它显示为数字55。检查必须完成。只需输入数字。是否有任何方法可以完成输入检查?链接或答案请帮助确切的问题是,当我输入55ffghfg时,“ffghfg”作为一个值传递给数组中的下一个成员,因此此行为导致第一个数字是55(没关系),但会创建错误,并重复下一个成员的输入,即使尚未为该数字输入任何内容。

cin
就是这样做的。它只是尝试读取您请求的数据类型(在本例中为float),如果得到一个,则输入指针将停留在输入数据的下一个字节。如果要使用该行的其余部分,则需要在获得浮点后读取一个字符串,该字符串包含换行符。我刚刚将提示翻译为英语。@VeljkoStefanovic我在这里写了一个解决该问题的答案——我刚才看到了。只提取字符串的可用部分,丢弃其余部分。然后在下一次输入中使用剩余部分,然后当循环再次丢弃其余部分时,现在您可以为循环的第二次迭代输入有效输入。我希望它可以丢弃所有内容,而不是将字符串的垃圾部分传输到下一次迭代,但这是规则。因此,基本上我需要在字符串中输入值键入变量,然后将其转换为float?我只是不想进行任何类型的转换,只需检查值的类型是否正确。这是一种方法,是的,但这也需要大量的工作,您可能会出错。用户可能知道,您的程序将要求一个数字,然后是一个字符串,然后只需键入55x。您的程序很简单,但在某些情况下t可能是正确的。在55x的情况下,cin将把55放在r中,你应该假设这是正确的。在循环的下一次迭代中,你的代码将看到x,然后它将返回一个错误并说输入无效。换句话说,不要试图纠正所有可能的未来错误。如果你现在期望一个浮点,那么就用cin>>r寻找一个浮点。是吗这有意义吗?是的,我知道。没有人能预测所有可能的错误和警告。希望这会随着我未来编程技能的提高而改变:)谢谢,伙计。
#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;
}