C-get_num()函数还是有问题、、
#include <stdio.h>
#include <math.h>
void get_num(float * px, float * py);//获取两个浮点数
void calculate(double * panswer, float * px, float * py);//计算结果
int main(void)
{
float x, y;
double answer;
printf("请输入两个浮点数:n");
get_num(&x, &y);
calculate(&answer, &x, &y);
printf("二者之差除以二者之积的结果是:n%lf或%lfn",
answer, -answer);
return 0;
}
void get_num(float * px, float * py)
{
while (scanf("%f%f", &*px, &*py) != 2)
{
printf("输入有误!重新输入:n");
while (getchar()!='n')
continue;
}
return;
}
void calculate(double * panswer, float * px, float * py)
{
*panswer = fabs(*px - *py) / (*px * *py);
return;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
不能依赖scanf函数的返回值来判断数字的合法性
scanf返回值只能代表scanf接受的数据的个数,但不代表它接受的是你想要的数据
该怎样处理这样的输入?
其实按照你图上第二个输入,在scanf看来并不是错误的输入!因为scanf函数会根据格式来读取字符,直到遇到不匹配的输入,或者EOF。
所以
while (scanf("%f%f", &*px, &*py) != 2)
这句是没有问题的。你输入的测试数据1.5 2.5 EF在scanf看来也是没有问题的。
当读到EF的时候,因为它不匹配%f,scanf就会把它当作一个输入结束的标识,然后
返回已经读取到的数据(1.5 2.5)的数量,也就是2。
scanf("%f,%fn", &px, &py) ,应该是这个样子,要明确输入的数字的个数
scanf("%f%f", &*px, &*py)
改成
scanf("%f,%f", &*px, &*py)
试试
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
所以,你的第一种输入时,是scanf遇到EF非法字符,且两个数据域都有了数据,所以正常结束;第二种,是由于遇到EF前的空格时,每个数据域都有数据,所以正常结束。
另外,scanf在输入一个Enter(回车),才有可能结束scanf的输入,在这种情况下,多输入了几个数据是很有可能的。因此,用scanf来控制“输入”数据的个数,是比较困难的。