cstring-parsingstrtoul

How to use `strtoul` to parse string where zero may be valid?


According to the documentation for strtoul, regarding its return value...

This function returns the converted integral number as a long int value. If no valid conversion could be performed, a zero value is returned.

What if I'm parsing a user-supplied string of "0" where, for my application, "0" may be a valid entry? In that case it seems that I have no way to determine from using strtoul if a valid conversion was performed. Is there another way to handle this?


Solution

  • How to use strtoul to parse string where zero may be valid?

    Any value returned from strtoul() may be from an expected string input or from other not so expected strings. Further tests are useful.

    The following strings all return 0 from strtoul()

    strtoul() has the various detection modes.

    int base = 10;
    char *endptr;  //  Store the location where conversion stopped
    
    errno = 0;
    unsigned long y = strtoul(s, &endptr, base);
    
    if (s == endptr) puts("No conversion");      // "", "abc"
    else if (errno == ERANGE) puts("Overflow");
    else if (*endptr) puts("Extra text after the number"); // "0xyz", "0 ", "0.0"
    else puts("Mostly successful");
    

    What is not yet detected.


    To also detect negative values:

    // find sign
    while (isspace((unsigned char) *s)) {
      s++;
    }
    char sign = *s;
    
    int base = 10;
    char *endptr;  //  Store the location where conversion stopped
    errno = 0;
    unsigned long y = strtoul(s, &endptr, base);
    
    if (s == endptr) puts("No conversiosn");
    else if (errno == ERANGE) puts("Overflow");
    else if (*endptr) puts("Extra text after the number"); 
    else if (sign == '-' && y != 0) puts("Negative value"); 
    else puts("Successful");