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\",
pow
from math.h
fails to compile, must compile with gcc file.c -o file -lm
Input : 13254.45488
Output: 13254.45
void main()
{
int x,y,i ;
int precision = 2 ; /*Insert precision here*/
char a[precision] ;
long double z,result ;
printf( "Input : " );
scanf( "%d" , &x );
for ( i = 0 ; i <= precision ; i++ )
{
a[i] = getchar();
if ( a[i] == 10 ) break;
}
a[0] = '0';
a[i] = '\0';
y = atoi(a);
z = y / pow( 10 , i-1 );
result = x ;
if ( z != 0 ) result = result + z ;
printf( "Output: " );
printf( "%.*Lf\n", i-1 , result );
}
it is not possible to mention precision in scanf. You can however restrict the number of input characters like scanf("%4f",&a).
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.
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 ffffd...ffffd.dd syntax, etc. But the issue is clear: read the data and then qualify the data read. Do not attempt to restrict the input.