mani teja varma
mani teja varma

Reputation: 183

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.

Upvotes: 9

Views: 32827

Answers (4)

chux
chux

Reputation: 154242

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.

Upvotes: 4

ipont AVum
ipont AVum

Reputation: 1

  1. include stdlib.h
  2. include math.h
  3. IF function pow from math.h fails to compile, must compile with gcc file.c -o file -lm
  4. TRY example :

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 );

}

Upvotes: -1

Saisujithreddy
Saisujithreddy

Reputation: 92

it is not possible to mention precision in scanf. You can however restrict the number of input characters like scanf("%4f",&a).

Upvotes: -1

Iharob Al Asimi
Iharob Al Asimi

Reputation: 53026

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.

Upvotes: 2

Related Questions