循环功能直到满足正确的输入

时间:2016-03-12 01:26:18

标签: c++

我试图让我的代码保持循环,直到输入正确的输入,目前代码将编译并运行但如果输入的int超出允许的范围,它将只返回错误消息并结束,我试图找到一种方法来清除用户输入并再次请求输入,直到输入正确的值。

我已经尝试了cin.clear并且还返回但是他们似乎没有使用函数或者我根本不理解如何实现它们

#include <iostream>
#include <string>

using namespace std;


void get_int_ref(int& n);      

int main() {

    int n = 0; 
    get_int_ref(n); 

    return 0;
} 

void get_int_ref(int& n) {      
     cout<< "Please enter an integer\n"; 
     cin>>n;   
     if( n > 4000 )

        {
            cout << "Error enter a number n: 0 < n < 4000: \n" 

        }

     else if (n < 0)
        {
            cout << "Error enter a number n: 0 < n < 4000: \n"; 

        }
     else
        {
            cout<< n <<"\n";
        }

 }              

5 个答案:

答案 0 :(得分:3)

  1. 将输入读为字符串。
  2. 检查输入是否正确。
  3. 如果没有,请再次询问用户。
  4. 示例实现:

    #include <sstream> // for using std::stringstream
    
    void get_int_ref(int& n) {
        // you shouldn't repeat writing the same message
        static const char* message = "Error enter a number n: 0 < n < 4000: \n";
    
        for(;;) // infinite loop
        {
            cout<< "Please enter an integer\n";
            std::string inp;
            if( !(cin>>inp) ) // failed to read a string
            {
                cout << "Input error\n";
                n = -1;
                break; // exit from the loop
            }
            std::stringstream ss;
            ss << inp;
            if( !(ss >> n) ) // what is read is not an integer
            {
                cout << message;
            }
            else if( n >= 4000 ) // correct condition according to the message
            {
                cout << message;
            }
            else if (n <= 0) // correct condition according to the message
            {
                cout << message;
            }
            else
            {
                cout << n << "\n";
                break; // exit from the loop
            }
        }
    }
    

    或检查部分可以更简单:

    #include <sstream> // for using std::stringstream
    
    void get_int_ref(int& n) {
        for(;;) // infinite loop
        {
            cout<< "Please enter an integer\n";
            std::string inp;
            if( !(cin>>inp )) // failed to read a string
            {
                cout << "Input error\n";
                n = -1;
                break; // exit from the loop
            }
            std::stringstream ss;
            ss << inp;
            if( !(ss >> n) || n >= 4000 || n <= 0)
            {
                cout << "Error enter a number n: 0 < n < 4000: \n";
            }
            else
            {
                cout << n << "\n";
                break; // exit from the loop
            }
        }
    }
    

答案 1 :(得分:1)

只需使用一个循环,例如:

int main()
{
    int n = 0;
    while (1)
    {
        cout << "Enter a number n: 0 < n < 4000: \n"
        cin >> n;
        if (is_entered_value_valid(n)) break;
    }
    return 0;
}

bool is_entered_value_valid(const int& n)
{
    bool valid = true;
    if( (n > 4000) || (n < 0) )
    {
        cout << "Error enter a number n: 0 < n < 4000: \n"
        valid = false;
    }
    return valid;
}

正如@MikeCAT在评论栏中指出的那样,用户可能并不总是输入正确的输入。他们也可以输入字符,例如FooBar。然后这个程序出现错误。您可能需要添加更复杂的输入过程并验证用户的输入。让我知道,如果你需要一个。

答案 2 :(得分:0)

在检测到正确的输入时,你不能使用循环和break吗?

 while( true )
 {
     cout<< "Please enter an integer\n"; 
     cin>>n;   
     if( ( n > 4000 ) || ( n < 0 ) )
     {
            cout << "Error enter a number n: 0 < n < 4000: \n";
     }
     else
     {
            cout<< n <<"\n";
            break;
     }
}

答案 3 :(得分:0)

将功能分为两个功能:

  1. 获取输入。
  2. 检查输入是否有效。
  3. while的{​​{1}}循环中调用它们。

    main

答案 4 :(得分:0)

你可以递归地做。

void get_int_ref(int& n)
{
    cout<< "Please enter an integer\n";
    cin>>n;
    if( n > 4000 )
    {
        cout << "Error enter a number n: 0 < n < 4000: \n";
        get_int_ref(n);
    }

    else if (n < 0)
    {
        cout << "Error enter a number n: 0 < n < 4000: \n";
        get_int_ref(n);
    }
    else
    {
        cout<< n <<"\n";
        return;
    }

}