How to ignore floating number in scanf("%d")?
Since the start of a floating point number with any digits before the decimal point looks like an integer, there is no way to detect this with %d
alone.
You might consider reading the whole line with fgets()
and then analyzing with sscanf()
:
int a;
int n;
char line[4096];
if (fgets(line, sizeof(line), stdin) != 0 && sscanf(line, "%d%n", &a, &n) == 1)
...analyze the character at line[n] for validity...
(And yes, I did mean to compare with 1; the %n
conversion specifications are not counted in the return value from sscanf()
et al.)
One thing that scanf()
does which this code does not do is to skip blank lines before the number is entered. If that matters, you have to code a loop to read up to the (non-empty) line, and then parse the non-empty line. You also need to decide how much trailing junk (if any) on the line is tolerated. Are blanks allowed? Tabs? Alpha characters? Punctuation?
You'll have to read it as a double and then check if it is an integer. The best way to check if it is an integer is to use modf, which returns the decimal portion of the double. If there is one you have an error:
double d;
scanf("%lf", &d);
double temp;
if(modf(d, &temp)){
// Handle error for invalid input
}
int a = (int)temp;
This will allow integers or floating point numbers with only 0
s after the decimal point such as 54.00000
. If you want to consider that as invalid as well, you are better off reading character by character and verifying that each character is between 0
and 9
(ascii 48 to 57).
This can not be done with out reading pass the int
to see what stopped the scan.
Classic idiom
char buf[100];
if (fgets(buf, sizeo(buf), stdin) == NULL) {
; // deal with EOF or I/O error
}
int a;
char ch;
if (1 != sscanf(buf, "%d %c", &a, &ch)) {
; // Error: extra non-white space text
}