Answer S10
#include <stdio.h>
#include <stdlib.h>
double stringToDouble( char *p )
{
double intPart=0.0, fractionPart=0.0;
int multiplier = 1; /* change to -1 if string starts with minus */
/* Find the sign for the entire number */
if ( *p == '+' ) p++;
if ( *p == '-' )
{
multiplier = -1;
p++ ;
}
/* Convert the integer part of the number */
while ( *p >= '0' && *p <= '9' )
{
intPart *= 10;
intPart += *p - '0';
p++ ;
}
/* Convert the fractional part of the number */
if ( *p == '.' )
{
double divisor = 1.0;
p++ ;
while ( *p >= '0' && *p <= '9' )
{
divisor *= 10.0;
fractionPart += (*p - '0')/divisor;
p++ ;
}
}
/* Put the pieces together */
return (intPart + fractionPart)*multiplier ;
}
int main()
{
char *trials[] =
{
"1",
"1.2",
"+1",
"-8.000",
"+2003.99",
"-3.45",
"98.76 ",
"12..5",
"rats",
"+95.M",
"+ 234",
".999",
"+1.345E+005" /* Our function will not work for this */
};
int j ;
for ( j=0; j<sizeof(trials)/sizeof(char *); j++ )
{
printf("%s is converted into: %lf\t\tshould be: %lf\n", trials[j],
stringToDouble( trials[j]), atof( trials[j]) );
}
return 0;
}