如何询问年龄并将其他所有内容设置为无效?

时间:2016-02-13 17:18:52

标签: c++ c++11

我正在尝试设置一个要求Age的基本程序,如果用户输入的数字小于99,它会说“完美”。如果数字超过99,它会说“你不能那么老,再试一次”。另外,如果用户输入的不是数字(如字母“m,r”或其他任何类似“icehfjc”),那么它会说“那不是数字。”

到目前为止,这是我的代码:

#include <iostream>
#include <string>
using namespace std;

int main()
{
int age;

backtoage:
cout << "How old are you?\n";
cin >> age;

if (age < 99)
{
        cout << "Perfect!\n";
        system("pause");
        }

    if (age > 99)
    {
        cout << "You can't be that old, Try again.\n";
        system("pause");
        system("cls");
        goto backtoage;
    }

    Else
    {
       cout << "That is not a number, Please Enter a Valid Number\n";
       system("pause");
       system("cls");
       goto backtoage;
    }

}

我知道“Else”不起作用,因为C ++也将字母视为整数,所以 如果我写“m”,它将把它作为> 99的数字(因为“m”的整数值)因此显示“你不能那么老”的消息。但是如何解决此问题,以便在输入信件时程序显示“请输入数字”? (如果有人能修复代码并以有效的方式编写代码,我会 永远感激。)

非常欢迎任何建议,提示或提示。

3 个答案:

答案 0 :(得分:6)

  

所以,如果我写“m”,它将把它作为> 99的数字(因为“m”的整数值)

不,“m”无法输入到int,cin将失败。所以你应该做的是检查cin的状态,例如

if (cin >> age) {  

    // ok
    if (age < 99)
    {
        ...
    } else 
    {
        ...
    }
}
else
{
    // failed
    cout << "That is not a number, Please Enter a Valid Number\n";
    system("pause");
    system("cls");
    cin.clear(); // unset failbit
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
    goto backtoage;
}

检查std::basic_istream::operator>>

的行为
  

如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit。

BTW:goto在现代c ++编程中几乎已经过时了。用循环实现相同的逻辑应该很容易。

LIVE

答案 1 :(得分:5)

  

您可以尝试它。它将在C ++中验证数字输入。如果输入有效,则cin.good()函数返回true,如果输入无效则返回fasecin.ignore()用于忽略其余部分   输入缓冲区,包含错误输入和cin.clear()   用来清除旗帜。

#include <iostream>
#include<string>
#include <limits>
using namespace std;

int main() {
    backtoage:
    int age = 0;
    cout << "How old are you?\n";
    cin >> age;
    if(cin.good()){
        if (age < 99){
        cout << "Perfect!\n";
        system("pause");
        }
        else if (age > 99){
            cout << "You can't be that old, Try again.\n";
            system("pause");
            system("cls");
            goto backtoage;
        }
    }
    else{
       cout << "That is not a number, Please Enter a Valid Number\n";
       system("pause");
       system("cls");
       cin.clear();
       cin.ignore(numeric_limits<streamsize>::max(), '\n');
       goto backtoage;
    }
    return 0;
}
  

<强>输入/输出:

How old are you?
k
That is not a number, Please Enter a Valid Number
How old are you?
120
You can't be that old, Try again.
How old are you?
10
Perfect!

答案 2 :(得分:0)

首先,如果用户可以输入“m”,k'或其他任何字符,我建议使用string,然后如果要更改为数字,只需减去“0”,这样就可以了与数字一起工作,其次是程序员,通常不使用goto语句,因为它可能是危险的,并且会使不良行为出现在您的程序中。
对不起,我的英语不好。

 #include<iostream>    
 #include <string>   
 using namespace std;    
int main()     
{   

string input;   
getline(cin, input);  
unsigned int lenght = input.size(),age=0;  
for (int i = 0; i < lenght; ++i) {  
    if (input[i] >= '0' && input[i] <= '9') {  
        age = age*10+(int)input[i]-'0';  

    }
}
if (age > 99)
    cout << "Nice try , you can`t be that old\n";
else
    cout << "perfect!\n";
return 0;
}