我正在尝试用 C (gcc) 编写代码以仅接受带小数的浮点数并拒绝整数、特殊字符、字母数字条目。
有效条目是:
1.23, 3.45, 6.77
无效条目:
abc, e34, 834ww, 6, 9,
还有一些不是浮动的废话。
这是我尝试过的:
#include <stdio.h>
int main()
{
double floatnum;
double decpart=0.000000;
printf("Enter a floating number num: ");
while (decpart == 0.0000000)
{
scanf("%lf", &floatnum);
int intpart = (int)floatnum;
double decpart = floatnum - intpart;
if (decpart == 0.000000){
printf("Invalid floating point number, enter again: ");
}
else
{
printf("Number entered = %.2f\n", floatnum);
break;
}
}
return 0;
}
我不需要确切的代码,但我需要一些关于实现这一目标的最佳方法的指针/线索。
我修改了你的代码,删除了scanf
部分并用以下组合替换它fgets
and strtod
.
已完成检查:
- 输入的有效数字(通过检查 endptr 是否返回
strtod
上的点linefeed
char,意味着整个输入的字符串已被正确解析):避免无效的数字和形式,例如42.4xxxx
被接受atof
例如
- 如果在单个数字后添加尾随空格,则它会被换行符替换,从而被程序接受
- 您的十进制检查代码,未更改
- 该程序让数字像
12.455e+1
pass (124.55
),也许这是一个feature而不是一个错误,因为它作为浮点数有效。
固定代码:
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
int main()
{
double decpart;
printf("Enter a floating number num: ");
char buf[100];
int len;
char *endptr;
while (fgets(buf,sizeof(buf),stdin) != NULL)
{
len = strlen(buf)-1;
// right strip spaces (replace by linefeed like fgets ends the input)
while (len>0)
{
len--;
if (buf[len]==' ')
{
buf[len]='\n';
}
else
{
break;
}
}
double floatnum = strtod(buf,&endptr);
if ((endptr==buf)||(endptr[0]!='\n'))
{
printf("Invalid floating point number, enter again: ");
}
else
{
int intpart = (int)floatnum;
double decpart = floatnum - intpart;
if (decpart == 0.000000){
printf("Invalid floating point number, enter again: ");
}
else
{
printf("Number entered = %.2f\n", floatnum);
break;
}
}
}
return 0;
}
tests:
Enter a floating number num: no
Invalid floating point number, enter again: 45
Invalid floating point number, enter again: 45.6xxx
Invalid floating point number, enter again: 45.6
Number entered = 45.60
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)