Is this the correct approach to do input validation with floating point values?

后端 未结 4 1491
忘了有多久
忘了有多久 2021-01-22 11:26

After spending a good amount of time researching input validation, I combined a few ideas and came up with this:

Function to check a string for a valid dou

相关标签:
4条回答
  • 2021-01-22 12:07

    I'm not sure about "the" correct way, but it's certainly not how I'd do it. First and probably most obvious, this chunk of code:

        for (i = 0, d = 0; i < BUFFSIZE && buffer[i] != 0 && buffer[i] >= '0' &&
                 buffer[i] <= '9' || (buffer[i] == '.' && d == 0); i++)
                if (buffer[i] == '.') ++d;
    

    is duplicated in a couple of places (at least I think the other instance is identical, and probably should be anyway).

    Second, you don't appear to allow numbers like 1e23 or -1.2, which are usually accepted as floating point.

    Offhand, I think I'd use strtod to attempt to convert the input. You can use its second parameter to detect whether a conversion reached the end of the input string (if not, you'll know at least part of the input wasn't accepted). You'll then (apparently) want to check that the returned value was in the desired range.

    0 讨论(0)
  • 2021-01-22 12:09

    If it's an exercise you want, that's understandable. But otherwise, you can use istringstream to avoid reinventing the wheel:

    #include <iostream>
    #include <sstream>
    #include <string>
    
    using namespace std;
    
    int main () {
    
      int n,val;
      string stringvalues;
    
      stringvalues = "3.14159254 f01fhasfljk";
      istringstream iss(stringvalues);
    
      float x,y;
      iss >> x;
    
      cout << x * 2 << endl;
    
      iss >> y;
      if ( ! iss.fail() )
        {
          cout << y * 2 << endl;
        }
      else
        {
          cout << "second value not a number..." << endl;
        }
    
      return 0;
    }
    
    0 讨论(0)
  • 2021-01-22 12:23

    Perhaps the strtod() function can be of help here, as it tells you how much has been converted:

    const char * buf = get_raw_data(); // somehow
    
    char * endptr;
    const double value = strtod(buf, &endptr);
    
    if (endptr != buf + std::strlen(buf))  { /* ... error ... */ }
    

    As the source for buf you could tokenize your input with std::string token; std::cin >> token; or something like that and use token.c_str().

    0 讨论(0)
  • 2021-01-22 12:30

    Based on the feedback of those who answered and some of the examples in other questions, I answered my own question. As per FailedDev's suggestion, this question should be marked answered. So here is the accepted answer. :)

    0 讨论(0)
提交回复
热议问题