diff options
| author | Sadeep Madurange <smadurange@users.noreply.github.com> | 2021-12-05 12:20:24 +0800 |
|---|---|---|
| committer | Sadeep Madurange <smadurange@users.noreply.github.com> | 2021-12-05 12:20:24 +0800 |
| commit | f4a422e2d69731be5eabfcb1a6ab722aadb84322 (patch) | |
| tree | 6af4bcbb9f6f3c038e569e2056057d3d244c0080 /4/2.c | |
| parent | da633eb55be20b86a004a172ce5fe720ae5e8de9 (diff) | |
| download | k&r-exercises-f4a422e2d69731be5eabfcb1a6ab722aadb84322.tar.gz | |
4.2
Diffstat (limited to '4/2.c')
| -rw-r--r-- | 4/2.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -0,0 +1,48 @@ +#include <ctype.h> +#include <stdio.h> + +#define MAXLEN 1000 + +/* converts string to numeric representation of doubles */ +double atof(char s[]); + +int main(int argc, char *argv[]) { + int i, c; + char s[MAXLEN]; + + printf("input: "); + + for (i = 0; i < MAXLEN - 1 && (c = getchar()) != '\n' && c != EOF; i++) + s[i] = c; + s[i] = 0; + + printf("numeric: %f\n", atof(s)); + + return 0; +} + +double atof(char s[]) { + int i, sign; + double val, power; + + for (i = 0; isspace(s[i]); i++) + ; + + sign = (s[i] == '-') ? -1 : 1; + + if (s[i] == '+' || s[i] == '-') + i++; + + for (val = 0.0; isdigit(s[i]); i++) + val = 10.0 * val + (s[i] - '0'); + + if (s[i] == '.') + i++; + + for (power = 1.0; isdigit(s[i]); i++) { + val = 10.0 * val + (s[i] - '0'); + power *= 10.0; + } + + return sign * val / power; +}
\ No newline at end of file |
