将用户输入限制为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]);
}
}
答案 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