#include #include #include double c2f(double celsius) { return ((9.0 / 5.0) * celsius) + 32.0; } double f2c(double fahrenheit) { return (5.0 / 9.0) * (fahrenheit - 32.0); } int usage(const char *msg) { printf("Usage: temperatures [fFcC]\n"); if (msg != NULL) { printf("%s\n", msg); } return 1; } int main(int argc, char * argv[]) { if (argc < 2) { usage(NULL); return 2; } int ret; char msg[255]; double temp; char scale = '\0'; 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; } switch (scale) { case 'c': case 'C': printf(out_fmt, c2f(temp), 'F'); break; case 'f': case 'F': printf(out_fmt, f2c(temp), 'C'); break; default: sprintf(msg, "Unknown scale: '%c'", scale); usage(msg); break; } return 0; }