【问题标题】:how to check if inputed value is valid value in c++如何检查输入值是否是c ++中的有效值
【发布时间】: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


【解决方案1】:

行:

cin &gt;&gt; r

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

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

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

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

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

附言- 我几乎不想这样说,因为我不想听起来有偏见,但是当你正在学习 C++ 时,你可能会发现用英语编写所有代码(包括提示)很有用。如果您稍后在 StackOverflow 上寻求帮助,将会更容易让更多人了解您正在尝试做什么,从而帮助您。

【讨论】:

  • 所以基本上我需要将值输入字符串类型变量,然后将其转换为浮点数?我只是不想做任何类型的转换,只是检查值是否是正确的类型。
  • 这是一种方法,是的,但它也需要大量工作,并且你可能错了。用户可能知道您的程序会要求输入一个数字,然后输入一个字符串,然后输入 55x。您的程序很简单,但在某些情况下可能是正确的。在 55x 的情况下,cin 会将 55 放入 r,您应该假设这是正确的。在循环的下一次迭代中,您的代码将看到 x,then 它应该返回一个错误并说无效输入。换句话说,不要试图纠正所有可能的未来错误。如果您希望 now 有一个浮点数,那么寻找一个带有 cin >> r 的浮点数。这有意义吗?
  • 是的,我知道。没有人可以预测所有可能的错误和警告。希望当我未来的编程技能变得更强时,情况会有所改变:)谢谢伙计。
【解决方案2】:

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

【讨论】:

  • 我只是想检查它的输入值是否是一个数字。正如我上面所说的“55”只是正确的答案。不是“sdfsf55”的“55fddfg”或只是“dgfg”。所以只是检查如果输入的值是 CLEAN NUMBER 而不是其他值。例如,如果您输入“55dgfdf”,则显示为数字 55。必须完成检查。仅应输入数字。
  • 有什么方法可以进行完整的输入检查吗?链接或答案请帮助
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2011-02-05
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多