获取多个输入并验证它们c++

s6fujrry  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(241)

我有多个枚举,它们的作用就像程序的设置。我想从用户输入中一个接一个地获取它们,并不断要求用户输入某个设置,直到给出有效的输入,但我觉得我的方法重复了很多代码。有更好/更聪明的方法吗?
代码:

  1. #include <iostream>
  2. #include <limits>
  3. enum Input1 {Type1 = 1, Type2 = 2, Type3 = 3, Type4 = 4};
  4. enum Input2 {Type11 = 5, Type22 = 17};
  5. bool validate_input(Input1 input1, Input2 input2 = Type11) {
  6. if(input1 != Type1 && input1 != Type2 && input1 != Type3 && input1 != Type4) {
  7. return false;
  8. }
  9. if(input2 != Type11 && input2 != Type22) {
  10. return false;
  11. }
  12. return true;
  13. }
  14. int main()
  15. {
  16. int iInput1, iInput2, iInput3;
  17. Input1 eInput1;
  18. Input2 eInput2;
  19. bool return_val;
  20. do {
  21. std::cout << "Select option: 1. 2. 3. 4.";
  22. std::cin >> iInput1;
  23. if (std::cin.fail()) {
  24. std::cin.clear();
  25. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  26. }
  27. eInput1 = (Input1) iInput1;
  28. return_val = validate_input(eInput1);
  29. if (!return_val) {
  30. std::cout << "Invalid input!\n";
  31. }
  32. } while (!return_val);
  33. do {
  34. std::cout << "Select option: 1. 2.";
  35. std::cin >> iInput2;
  36. if (std::cin.fail()) {
  37. std::cin.clear();
  38. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  39. }
  40. eInput2 = (Input2) iInput2;
  41. return_val = validate_input(eInput1, eInput2);
  42. if (!return_val) {
  43. std::cout << "Invalid input!\n";
  44. }
  45. } while (!return_val);
  46. return 0;
  47. }

字符串

envsm3lx

envsm3lx1#

您可以使用通用模板并简化此代码,这将得到优化并更易于阅读。

  1. #include <iostream>
  2. #include <limits>
  3. enum Input1 { Type1 = 1, Type2 = 2, Type3 = 3, Type4 = 4};
  4. enum Input2 { Type11 = 1, Type22 = 2};
  5. bool validate_input(Input1 input1, Input2 input2 = Type11) {
  6. return (input1 >= Type1 && input1 <= Type4) && (input2 == Type11 || input2 == Type22);
  7. }
  8. template <typename T>
  9. T get_valid_input(const std::string& prompt, const std::string& error_message = "Invalid input! Try again.") {
  10. T input;
  11. do {
  12. std::cout << prompt;
  13. std::cin >> input;
  14. if (std::cin.fail()) {
  15. std::cin.clear();
  16. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  17. } else {
  18. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  19. return input;
  20. }
  21. std::cout << error_message << std::endl;
  22. } while (true);
  23. }
  24. int main() {
  25. Input1 eInput1;
  26. Input2 eInput2;
  27. eInput1 = get_valid_input<Input1>("Select option: 1, 2, 3 or 4:", "Invalid input for input1! Must be between 1 and 4.");
  28. eInput2 = get_valid_input<Input2>("Select option: 1 or 2:", "Invalid input for input2! Must be 1 or 2.");
  29. std::cout << "Valid inputs: " << static_cast<int>(eInput1) << ", " << static_cast<int>(eInput2) << std::endl;
  30. return 0;
  31. }

字符串

展开查看全部

相关问题