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

后端 未结 2 1081
遥遥无期
遥遥无期 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条回答
  • 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 <cctype> for isdigit() and <cstdlib> 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;
    }
    
    0 讨论(0)
  • 2020-12-21 00:57

    Reason for Infinite loop:

    cin goes into a failed state and that makes it ignore further calls to it, till the error flag and buffer are reset.

    cin.clear();
    cin.ignore(100, '\n'); //100 --> asks cin to discard 100 characters from the input stream.
    

    Check if input is numeric:

    In your code, even a non-int type gets cast to int anyway. There is no way to check if input is numeric, without taking input into a char array, and calling the isdigit() function on each digit.

    The function isdigit() can be used to tell digits and alphabets apart. This function is present in the header.

    An is_int() function would look like this.

    for(int i=0; char[i]!='\0';i++){
       if(!isdigit(str[i]))
          return false;
    }
    return true;
    
    0 讨论(0)
提交回复
热议问题