From fb67d9ce5a71feee7b091d56a046c2ae42baaefe Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Mon, 27 Dec 2021 19:01:19 +0800 Subject: 5.2 --- 5/2.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 5/2.c diff --git a/5/2.c b/5/2.c new file mode 100644 index 0000000..db37319 --- /dev/null +++ b/5/2.c @@ -0,0 +1,73 @@ +#include +#include + +#define BUFSIZE 100 + +int getfloat(float *); + +int main(int argc, char *argv[]) { + int rc; + float f; + + while ((rc = getfloat(&f)) != EOF && rc != 0) + printf("\t%.8g\n", f); + + if (rc == 0) + printf("error: not a valid number\n"); + + return 0; +} + +char buf[BUFSIZE]; +int bufp = 0; + +int getch() { return (bufp > 0) ? buf[--bufp] : getchar(); } + +void ungetch(int c) { + if (bufp >= BUFSIZE) + printf("ungetch: too many characters\n"); + else + buf[bufp++] = c; +} + +int getfloat(float *pf) { + int c, sign, rad, div; + + rad = 0; + + while (isspace(c = getch())) + ; + + if (!isdigit(c) && c != EOF && c != '+' && c != '-' && c != '.') { + ungetch(c); + return 0; + } + + sign = (c == '-') ? -1 : 1; + + if ((c == '+' || c == '-') && !isdigit(c = getch()) && c != '.') { + ungetch(c); + return 0; + } + + for (*pf = 0.0, div = 1.0; isdigit(c) || c == '.'; c = getch()) { + if (c == '.') { + if (rad > 0) + return 0; + rad++; + continue; + } + + if (rad) + div *= 10; + + *pf = 10.0 * *pf + (c - '0'); + } + + *pf = (sign * *pf) / div; + + if (c != EOF) + ungetch(c); + + return c; +} \ No newline at end of file -- cgit v1.2.3