Christopher Clarke Christopher Clarke - 1 month ago 8
C Question

Floating point equivalent to strtol() in C

strtol
converts the inputed string str to a long value of any specified base of 2 to 36.
strtof()
offers a similar functionality but without allowing your to specify base. Is there another function that does the same as
strtof
but allows you to select base?

e.g Lets say 101.101 is inputted as a string. I want to be able to do

strtof("101.101", null, 2);


and get an output of
5.625.

Answer

You can parse the string to split it in the . and convert the part before and the part after to decimal. Afterwards, you can create a float out of that string. Here is a simple function that accomplishes that.

float new_strtof(char* const ostr, char** endptr, unsigned char base)
{
    char* str = (char*)malloc(strlen(ostr) + 1);
    strcpy(str, ostr);
    const char* dot = ".";

    /* I do not validate any input here, nor do I do anything with endptr */      //Let's assume input of 101.1101, null, 2 (binary)
    char *cbefore_the_dot = strtok(str, dot); //Will be 101
    char *cafter_the_dot = strtok(NULL, dot); //Will be 0101

    float f = (float)strtol (cbefore_the_dot, 0, base); //Base would be 2 = binary. This would be 101 in decimal which is 5
    int i;
    char n[2] = { 0 }; //will be just for a digit at a time

    for(i = 0 ; cafter_the_dot[i] ; i++) //iterating the fraction string
    {
        n[0] = cafter_the_dot[i];
        f += strtol(n, 0, base) * pow(base, -(i + 1)); //converting the fraction part
    }

    free(ostr);
    return f;
}

One could manage this in a more efficient and less dirty way but this is just an example to show you the idea behind this. The above works well for me.

Don't forget to #include <math.h> and compile with -lm flag. An example would be gcc file.c -o file -lm.