Avoiding infinite loop when a char is enter in place of int

后端 未结 2 1104
遥遥无期
遥遥无期 2020-12-21 00:03

I\'m doing a Banking System project and need to make sure that every input is valid(program has to be robust). If invalid input is given then user has to enter again.
Bu

2条回答
  •  萌比男神i
    2020-12-21 00:41

    Here is another approach that might help; first writing to std::string and then going over all elements in the string checking if they're digit. Using header for isdigit() and for std::atoi, although in c++11 you can use std::stoi if your compiler supports it.

    If you write: 141.4123, the result will be 141 after converting (if you let the user type '.'), the result will be truncated because you convert to an int.

    Working example:

    int str_check(string& holder, int& x)
    {
      bool all_digits = true; // we expect that all be digits.
    
      if (cin >> holder) {
        for(const auto& i : holder) {
          if (!isdigit(i) && i != '.') { // '.' will also pass the test.
            all_digits = false;
            break;
          }
        }
        if (all_digits) {
          x = atoi(holder.c_str()); // convert str to int using std::atoi
          return 1;
        }
        else
          return 0;
      }
    }
    
    int main()
    {
      int x{};
      string holder{};
      while (1)
      {
        if (str_check(holder, x))
          cout << x << '\n';
      }
    
      return 0;
    }
    

提交回复
热议问题