clinuxstringdoublestrtod

Problem with string conversion to number ( strtod )


I am using strtod( ) function to extract an environment variable as a string, and then changing it to double using strtod:

enter code here
 char strEnv[32];
 strncpy(strEnv, getenv("LT_LEAK_START"), 31);
 // How to make sure before parsing that env LT_LEAK_START is indeed a number?
 double d = strtod(strEnv, NULL);

Now i want to make sure that this number entered by user is a number and not a string or special character. How can i make sure of that?

A code snippet would be of great help.

Thanks in advance.


Solution

  • The 2nd argument to the strtod function is useful.

    char *err;
    d = strtod(userinput, &err);
    if (*err == 0) { /* very probably ok */ }
    if (!isspace((unsigned char)*err)) { /* error */ }
    

    Edit: examples added

    The strtod function tries to convert the initial portion of the 1st argument to a double and stops either when there are no more chars, or there is a char that can't be used to make a double.

    input         result
    ----------    ----------------------------
    "42foo"       will return 42
                  and leave err pointing to the "foo" (*err == 'f')
    
    "     4.5"    will return 4.5
                  and leave err pointing to the empty string (*err == 0)
    
    "42         " will return 42
                  and leave `err` pointing to the spaces (*err == ' ')