From c75da5dba7142ecf9650a326f758c9b65afe3e06 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Mon, 28 May 2012 13:13:07 -0400 Subject: [PATCH] More goofing around with temperature conversion for make near-mindless C practice. --- digressions/temperatures.c | 42 +++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/digressions/temperatures.c b/digressions/temperatures.c index 9400b0e..f99da2b 100644 --- a/digressions/temperatures.c +++ b/digressions/temperatures.c @@ -1,5 +1,6 @@ #include #include +#include double c2f(double celsius) { @@ -12,36 +13,57 @@ double f2c(double fahrenheit) { } -int die_usage(const char *msg) { +int usage(const char *msg) { printf("Usage: temperatures [fFcC]\n"); - printf("%s\n", msg); - exit(1); + if (msg != NULL) { + printf("%s\n", msg); + } + return 1; } int main(int argc, char * argv[]) { if (argc < 2) { - die_usage(""); + usage(NULL); + return 2; } + int ret; char msg[255]; double temp; char scale = '\0'; - const char * temp_string = argv[1]; + const char *in_fmt = "%lf%c"; + const char *out_fmt = "%.2lf%c\n"; + + if (((int)strlen(argv[1]) == 1) && (argv[1][0] == '-')) { + ret = fscanf(stdin, in_fmt, &temp, &scale); + } else { + const char * temp_string = argv[1]; + ret = sscanf(temp_string, in_fmt, &temp, &scale); + } + + if ((ret == 0) || (ret == EOF)) { + usage("No temperature provided!"); + return 1; + } + + if (ret == 1) { + usage("No scale provided!"); + return 1; + } - sscanf(temp_string, "%lf%c", &temp, &scale); switch (scale) { case 'c': case 'C': - printf("%.2lf\n", c2f(temp)); + printf(out_fmt, c2f(temp), 'F'); break; case 'f': case 'F': - printf("%.2lf\n", f2c(temp)); + printf(out_fmt, f2c(temp), 'C'); break; default: - sprintf(msg, "Unknown scale '%c'", scale); - die_usage(msg); + sprintf(msg, "Unknown scale: '%c'", scale); + usage(msg); break; }