aboutsummaryrefslogtreecommitdiff
path: root/7.5
diff options
context:
space:
mode:
Diffstat (limited to '7.5')
-rw-r--r--7.5/main.c2
-rw-r--r--7.5/op.c33
2 files changed, 14 insertions, 21 deletions
diff --git a/7.5/main.c b/7.5/main.c
index cf5194e..b65b44d 100644
--- a/7.5/main.c
+++ b/7.5/main.c
@@ -11,7 +11,7 @@ int main(void)
int opd2;
int c;
- while ((c = getop(op, MAXOP))) {
+ while ((c = getop(op, MAXOP)) != EOF) {
switch (c) {
case NUM:
push(atof(op));
diff --git a/7.5/op.c b/7.5/op.c
index e7640e6..426baad 100644
--- a/7.5/op.c
+++ b/7.5/op.c
@@ -4,29 +4,22 @@
char getop(char *op, size_t len)
{
- size_t i;
+ int rs;
+ double f;
- *op = '\0'; // if scanf fails
- do {
- scanf("%c", op);
- } while (isblank(*op));
+ while ((rs = scanf("%c", op)) != EOF)
+ if (*op != ' ' && *op != '\t')
+ break;
- if (!isdigit(*op))
- return *op;
-
- i = 1;
- do {
- scanf("%c", op + i);
- } while (isdigit(op[i]) && ++i < len);
+ op[1] = '\0';
+ if (rs == EOF)
+ return EOF;
- if (op[i] == '.') {
- i++;
- do {
- scanf("%c", op + i);
- } while (isdigit(op[i]) && ++i < len);
- }
+ if (!isdigit(*op) && *op != '.')
+ return *op;
- ungetc(op[i], stdin);
- op[i] = '\0';
+ ungetc(*op, stdin);
+ scanf("%lf", &f);
+ snprintf(op, len, "%lf", f);
return NUM;
}