2016-11-15 43 views
0

所以我刚刚学会了输入验证,但是我遇到了一个问题。我强制用户输入一个数字而不是一个可用的字符串,但是如果用户输入一个数字(包含在开关盒中的数字)和一个字符串,那么程序会崩溃。有什么提示要改变什么,以便确认对所有东西都有效?输入验证w /数字和字符串

int menu(double pi)                //menu for choosing a shape 
{ 
    int choice = 0; 
    cout << "Please select what you wish to calculate:\n\n1 - Area of a Circle\n\n2 - Circumference of a Circle\n\n3 - Area of a Rectangle\n\n4 - Area of a Triangle\n\n5 - Volume of a Cuboid\n\n "; 
    while (!(cin >> choice)) 
    { 
     cout << "Invalid input, please enter a number of 1-5\n\n"; 
     cin.clear(); 
     cin.ignore(100, '\n'); 
    } 
    system("CLS"); 

    switch (choice)                //switch case for each shape 
     { 
     case 1: 
      circleArea(pi); 
      break; 
     case 2: 
      circleCircum(pi); 
      break; 
     case 3: 
      rectanArea(); 
      break; 
     case 4: 
      triangArea(); 
      break; 
     case 5: 
      cubVol(); 
      break; 
     default: 
      cout << "Invalid input! Please try again.\n\n"; 
      break; 
     } 
    return 0; 
} 
+0

通常,如果您想要防弹代码,您需要以字符串的形式读取输入内容,然后解析并将其转换为您想要的内容。 – NathanOliver

+0

呃,我有点明白你的意思,虽然不是很完美,如果不是问题,你会介意提供一些示例代码吗?我仍然是一个编程的菜鸟,在9月份开始 – PinkieBarto

回答

0

问题用

cin >> choice 

当输入一个号码是>>将停在第一个非数字输入,只要有数字输入,开始与它会将其视为一个有效的阅读。这意味着像2L,2.0-1T这样的东西都是有效的整数输入,就cin而言。它只是在流中留下无效部分。这是剩余的蒸汽输入,在下一次输入操作时混淆程序。

解决此问题的一种方法是使用getline将输入读入std::string,然后解析字符串以确保其包含有效输入。如果你想获得实例int

int choice; 
std::string input; 
std::size_t pos; 
do 
{ 
    std::cout << "Enter Choice: "; 
    std::getline(cin,input); 
    choice = stoi(input, &pos); 
} while(pos != input.size()); 

这可以确保你在一切都读了于推进入input和您只停止循环一旦进入一切都可以转换为有效的int

+0

我明白你在说什么,但我试图将其实施到我的程序中,但getline&stoi未被识别。是否有任何额外的库我应该使用或? (只是使用) – PinkieBarto

+0

@PinkieBarto你需要''为他们 – NathanOliver