如何限制用户输入C中带有一个小数点的浮点数

时间:2015-05-27 22:41:07

标签: c input decimal limit point

将用户输入限制为C中的一个小数点的程序。

例如:

输入成绩:5 //可接受
输入等级:8.5 //可接受
输入成绩:6.4 67 //不接受,重新输入成绩

#include <stdio.h>
#include <math.h>

main()
{       
    double grade[8];
    int i;

    for (i = 0; i < 8; i++) {           
        printf("Insert grade: ");
        scanf("%f", &grade[i]);
    }
}

4 个答案:

答案 0 :(得分:1)

您必须以字符串形式输入数据,然后检查它只有一个小数位。

无法输入浮点值然后检查小数位;因为浮点值在内部存储了二进制位置,并且在大多数情况下保持输入值的近似值。

输入代码可能如下所示:

char temp[20];
if ( 1 != scanf("%19s", temp) )
     return EXIT_FAILURE;

// code to check for decimal place goes here - I'm purposefully not 
// showing it as this looks like homework!

// once we have checked that the input is correct, then convert to double
grade[i] = strtod(temp, NULL);

答案 1 :(得分:1)

#include <stdio.h> // printf(), scanf()
#include <math.h> // floor()

main()
{

    double grade[8];
    int i;

    for (i = 0; i < 8; i++)
        {

            do
            {

                printf("Insert grade: ");
                scanf("%lf", &grade[i]);

                grade[i] *= 10;

                if (grade[i] != floor(grade[i])) // Prints error message, if user types more than one decimal point
                {
                    printf("Grade must have one decimal point.\nPlease re-enter grade.\n");
                }

            }while (grade[i] != floor(grade[i])); // Checks decimal point

        }

}

答案 2 :(得分:0)

使用fgets()将行读入缓冲区,然后测试该缓冲区。

char buf[99];
fgets(buf, sizeof buf, stdin);

// parse the line as a float - look for problems
char *endptr;
float f = strtof(buf, &endptr);
if (buf == endptr || *endptr != '\n') Fail_NonFloatInput();

// look for .
char *dot = strchr(buf, '.');
if (dot && isdigit(dot[1]) && isdigit(dot[2])) Fail_TooMuchPrecisison();
}

或者代码可以尝试:

long long i;
int f;
if (2 != scanf("%lld.%1d", &i, &f)) Bad_Input();
float fl = i + f/10.0;

但是float输入失败了123456789012345678901234567890.0 正如@Matt McNabb所述,请先阅读文字。

答案 3 :(得分:-2)

您可以使用printf格式说明符来指定您感兴趣的位置数。

格式说明符遵循此原型:[请参阅下面的兼容性说明]

   %[flags][width][.precision][length]specifier 

来自cplusplus.com的示例

#include <stdio.h>
int main()
{
    printf ("floats: %4.2f %+.0e %E \n", 3.1416, 3.1416, 3.1416);
    return 0
 }

输出

浮动:3.14 + 3e + 000 3.141600E + 000

此处有更多示例http://www.cplusplus.com/reference/cstdio/printf/