Read a Floating-Point Value from the User, Part 1
Obtaining user input can be done in many surprisingly different ways. This code is somewhere in the middle: safer than scanf("%lf", &n), but not bulletproof. It is meant to be a simple but relatively safe demonstration. Note also that there would be slight differences for using float instead of double.
The function mygetd reads user input from the stdin into a string using fgets. Then it attempts to convert this string to a double using sscanf. If both functions succeed, a 1 is returned; if either fails, a 0 is returned.
Leading whitespace, and other trailing characters are some things not handled. Those issues are handled in Read a Floating-Point Value from the User, Part 2 and Read a Floating-Point Value from the User, Part 3.Code:#include <stdio.h> int mygetd(double *result) { char buff [ 32 ]; /* modify array size to suit your needs */ return fgets(buff, sizeof buff, stdin) && sscanf(buff, "%lf", result) == 1; } int main(void) { double value; do { fputs("Enter a floating-point number: ", stdout); fflush(stdout); } while ( !mygetd(&value) ); printf("value = %g\n", value); return 0; } /* my output Enter a floating-point number: one Enter a floating-point number: Enter a floating-point number: f12.3 Enter a floating-point number: -45.67 value = -45.67 Enter a floating-point number: -12.3f value = -12.3 Enter a floating-point number: 125 help value = 125 */
Read a Floating-Point Value from the User, Part 2
Some issues, such as leading whitespace and trailing characters that cannot be part of a number, were not handled in Read a Floating-Point Value from the User, Part 1. Here such issues receive lip service. See also Read a Floating-Point Value from the User, Part 3.
Code:#include <stdio.h> #include <ctype.h> int mygetd(double *result) { char c, buff [ 32 ]; return fgets(buff, sizeof buff, stdin) && !isspace(*buff) && sscanf(buff, "%lf%c", result, &c) == 2 && (c == '\n' || c == '\0'); } int main(void) { double value; do { fputs("Enter a floating-point number: ", stdout); fflush(stdout); } while ( !mygetd(&value) ); printf("value = %g\n", value); return 0; } /* my output Enter a floating-point number: one Enter a floating-point number: Enter a floating-point number: f12.3 Enter a floating-point number: -45.67 value = -45.67 Enter a floating-point number: -12.3f Enter a floating-point number: 125 help Enter a floating-point number: 1.2.3 Enter a floating-point number: 1.23 value = 1.23 */
Read a Floating-Point Value from the User, Part 3
This snippet uses strtod to be a little more stringent.
Code:#include <stdio.h> #include <stdlib.h> #include <ctype.h> int mygetd(double *result) { char *end, buff [ 32 ]; return fgets(buff, sizeof buff, stdin) && !isspace(*buff) && (*result = strtod(buff, &end)), ( *end == '\n' || *end == '\0' ); } int main(void) { double value = -12.3; do { fputs("Enter a floating-point number: ", stdout); fflush(stdout); } while ( !mygetd(&value) ); printf("value = %g\n", value); return 0; } /* my output Enter a floating-point number: one Enter a floating-point number: Enter a floating-point number: f12.3 Enter a floating-point number: -45.67 value = -45.67 Enter a floating-point number: -12.3f Enter a floating-point number: 125 help Enter a floating-point number: 1.2.3 Enter a floating-point number: 1.23 value = 1.23 */
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks