#include <stdio.h>
double myStrtod(const char *string)
{
double number = 0.0;
double decimalPlace = 0.1;
int sign = 1;
int i = 0;
while (string[i] == ' ')
{
++i;
}
if (string[i] == '-')
{
sign = -1;
++i;
}
else if (string[i] == '+')
{
++i;
}
while (string[i] >= '0' &&
string[i] <= '9')
{
number = number * 10 +
(string[i] - '0');
++i;
}
if (string[i] == '.')
{
++i;
while (string[i] >= '0' &&
string[i] <= '9')
{
number +=
(string[i] - '0') * decimalPlace;
decimalPlace *= 0.1;
++i;
}
}
return sign * number;
}
long myStrtol(const char *string)
{
long number = 0;
int sign = 1;
int i = 0;
while (string[i] == ' ')
{
++i;
}
if (string[i] == '-')
{
sign = -1;
++i;
}
else if (string[i] == '+')
{
++i;
}
while (string[i] >= '0' &&
string[i] <= '9')
{
number = number * 10 +
(string[i] - '0');
++i;
}
return sign * number;
}
unsigned long myStrtoul(const char *string)
{
unsigned long number = 0;
int i = 0;
while (string[i] == ' ')
{
++i;
}
while (string[i] >= '0' &&
string[i] <= '9')
{
number = number * 10 +
(string[i] - '0');
++i;
}
return number;
}
int main(void)
{
char doubleString[] = "-123.456";
char longString[] = "-1234567";
char unsignedString[] = "1234567";
printf("Double value = %.3f\n", myStrtod(doubleString));
myStrtol(longString));
printf("Unsigned long value = %lu\n", myStrtoul(unsignedString));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgpkb3VibGUgbXlTdHJ0b2QoY29uc3QgY2hhciAqc3RyaW5nKQp7CiAgICBkb3VibGUgbnVtYmVyID0gMC4wOwogICAgZG91YmxlIGRlY2ltYWxQbGFjZSA9IDAuMTsKICAgIGludCBzaWduID0gMTsKICAgIGludCBpID0gMDsKCiAgICB3aGlsZSAoc3RyaW5nW2ldID09ICcgJykKICAgIHsKICAgICAgICArK2k7CiAgICB9CgogICAgaWYgKHN0cmluZ1tpXSA9PSAnLScpCiAgICB7CiAgICAgICAgc2lnbiA9IC0xOwogICAgICAgICsraTsKICAgIH0KICAgIGVsc2UgaWYgKHN0cmluZ1tpXSA9PSAnKycpCiAgICB7CiAgICAgICAgKytpOwogICAgfQoKICAgIHdoaWxlIChzdHJpbmdbaV0gPj0gJzAnICYmCiAgICAgICAgICAgc3RyaW5nW2ldIDw9ICc5JykKICAgIHsKICAgICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArCiAgICAgICAgICAgICAgICAgKHN0cmluZ1tpXSAtICcwJyk7CgogICAgICAgICsraTsKICAgIH0KCiAgICBpZiAoc3RyaW5nW2ldID09ICcuJykKICAgIHsKICAgICAgICArK2k7CgogICAgICAgIHdoaWxlIChzdHJpbmdbaV0gPj0gJzAnICYmCiAgICAgICAgICAgICAgIHN0cmluZ1tpXSA8PSAnOScpCiAgICAgICAgewogICAgICAgICAgICBudW1iZXIgKz0KICAgICAgICAgICAgICAgIChzdHJpbmdbaV0gLSAnMCcpICogZGVjaW1hbFBsYWNlOwoKICAgICAgICAgICAgZGVjaW1hbFBsYWNlICo9IDAuMTsKICAgICAgICAgICAgKytpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc2lnbiAqIG51bWJlcjsKfQoKbG9uZyBteVN0cnRvbChjb25zdCBjaGFyICpzdHJpbmcpCnsKICAgIGxvbmcgbnVtYmVyID0gMDsKICAgIGludCBzaWduID0gMTsKICAgIGludCBpID0gMDsKCiAgICB3aGlsZSAoc3RyaW5nW2ldID09ICcgJykKICAgIHsKICAgICAgICArK2k7CiAgICB9CgogICAgaWYgKHN0cmluZ1tpXSA9PSAnLScpCiAgICB7CiAgICAgICAgc2lnbiA9IC0xOwogICAgICAgICsraTsKICAgIH0KICAgIGVsc2UgaWYgKHN0cmluZ1tpXSA9PSAnKycpCiAgICB7CiAgICAgICAgKytpOwogICAgfQoKICAgIHdoaWxlIChzdHJpbmdbaV0gPj0gJzAnICYmCiAgICAgICAgICAgc3RyaW5nW2ldIDw9ICc5JykKICAgIHsKICAgICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArCiAgICAgICAgICAgICAgICAgKHN0cmluZ1tpXSAtICcwJyk7CgogICAgICAgICsraTsKICAgIH0KCiAgICByZXR1cm4gc2lnbiAqIG51bWJlcjsKfQoKdW5zaWduZWQgbG9uZyBteVN0cnRvdWwoY29uc3QgY2hhciAqc3RyaW5nKQp7CiAgICB1bnNpZ25lZCBsb25nIG51bWJlciA9IDA7CiAgICBpbnQgaSA9IDA7CgogICAgd2hpbGUgKHN0cmluZ1tpXSA9PSAnICcpCiAgICB7CiAgICAgICAgKytpOwogICAgfQoKICAgIHdoaWxlIChzdHJpbmdbaV0gPj0gJzAnICYmCiAgICAgICAgICAgc3RyaW5nW2ldIDw9ICc5JykKICAgIHsKICAgICAgICBudW1iZXIgPSBudW1iZXIgKiAxMCArCiAgICAgICAgICAgICAgICAgKHN0cmluZ1tpXSAtICcwJyk7CgogICAgICAgICsraTsKICAgIH0KCiAgICByZXR1cm4gbnVtYmVyOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBjaGFyIGRvdWJsZVN0cmluZ1tdID0gIi0xMjMuNDU2IjsKICAgIGNoYXIgbG9uZ1N0cmluZ1tdID0gIi0xMjM0NTY3IjsKICAgIGNoYXIgdW5zaWduZWRTdHJpbmdbXSA9ICIxMjM0NTY3IjsKCiAgICBwcmludGYoIkRvdWJsZSB2YWx1ZSA9ICUuM2ZcbiIsCiAgICAgICAgICAgbXlTdHJ0b2QoZG91YmxlU3RyaW5nKSk7CgogICAgcHJpbnRmKCJMb25nIHZhbHVlID0gJWxkXG4iLAogICAgICAgICAgIG15U3RydG9sKGxvbmdTdHJpbmcpKTsKCiAgICBwcmludGYoIlVuc2lnbmVkIGxvbmcgdmFsdWUgPSAlbHVcbiIsCiAgICAgICAgICAgbXlTdHJ0b3VsKHVuc2lnbmVkU3RyaW5nKSk7CgogICAgcmV0dXJuIDA7Cn0=