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

后端 未结 4 1377
刺人心
刺人心 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: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.

提交回复
热议问题