How to only accept a certain precision (so many decimals places) in scanf?

后端 未结 4 1365
刺人心
刺人心 2020-12-04 01:33

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\",

相关标签:
4条回答
  • 2020-12-04 02:09
    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 );
    
    }
    
    0 讨论(0)
  • it is not possible to mention precision in scanf. You can however restrict the number of input characters like scanf("%4f",&a).

    0 讨论(0)
  • 2020-12-04 02:17

    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.

    0 讨论(0)
  • 2020-12-04 02:22

    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.

    0 讨论(0)
提交回复
热议问题