How to only accept a certain precision (so many decimals places) in scanf?
In scanf()
function I want to take only upto decimal values.Can we achieve it?
For example for displaying upto two decimal places we use printf("%.2f",A)
How can we do it for scanf()
function.
scanf()
does not have a simple method to meet OP's goal.
Recommend using fgets()
for input and then parse the string.
char buf[20];
fgets(buf, sizeof buf, stdin); // Could add check for NULL here
To limit to 2 decimal places, code could read the number in parts: integer portion and fraction, then form the result:
long long ipart;
unsigned d[2];
int n;
if (sscanf(buf, "%lld.%1u%1u %n", &ipart, &d[0], &d[1], &n) != 3 || buf[n]) {
Handle_InvalidInput();
}
double value = (d[0]*10 + d[1])/100.0;
value = ipart + ipart < 0 ? -value : value;
Even though this fulfills OP's quest, I do not think it solves OP's larger goal. So rather than limit input, read the input and then qualify it:
double value;
if (sscanf(buf, "%lf %n", &value, &n) != 1 || buf[n]) {
Handle_InvalidInput();
}
double rounded_value = round(value * 100.0)/100.0;
if (rounded_value != value) {
Handle_OverlyPreciseNumber(value, rounded_value);
}
Other more pedantic methods would inspect the string buf
for ddd...ddd.dd syntax, etc. But the issue is clear: read the data and then qualify the data read. Do not attempt to restrict the input.
You can't do that, you can make scanf()
read a specific number of characters if you want like
float value;
scanf("%4f", &value);
and suppose the input is
43.23
it will read
43.2
but you can't specify precision.
It doesn't make sense, what you can do is
float value;
if (scanf("%f", &value) == 1)
printf("%.2f\n", value);
after all, the precision is limited by the binary representation, so making it have only two decimal places is pointless since in arithmetic operations it might be rounded.