这个函数的想法是要求一个正值,并确保使用递归不插入负值。
然而,当我测试它时,如果我输入的第一个值是负数,而该函数有效并且不允许代码继续进行直到输入正值,代码仍会打印插入的第一个值,无论它是否为满足了回报的要求。
#include <stdio.h>
float scanval()
{
float x;
printf("Insert positive value \n");
scanf("%f", &x);
if(x<0){
printf("Not a valid value \n");
scanval();
}
return x;
}
main()
{
printf("Value given %f \n", scanval());
}
答案 0 :(得分:2)
也许你应该记得保存返回值:
x = scanval()
在函数内部。
答案 1 :(得分:0)
首先要认识到递归不是这里适当的技术 你应该使用 而 循环。
但如果你需要递归用于任何作业目的:
float scanval()
{
float x;
printf("Insert positive value \n");
scanf("%f", &x);
if (x<0){ // While x is negative,
printf("Not a valid value \n"); // Showing an error message,
x = scanval(); // Try the routine again.
}
return x;
}
答案 2 :(得分:0)
你应该能够做到以下几点:
if(x<0){
printf("Not a valid value \n");
return scanval();
}
当然,最佳做法是在一个函数中只返回一个,但我不认为你关心它,因为你试图用递归来完成这个任务!
答案 3 :(得分:0)
你可以做的另一件事是这个
float scanval()
{
float x;
printf("Insert positive value \n");
if ((scanf("%f", &x) != 1) || (x < 0))
{
int chr;
while (((chr = getchar()) != EOF) && (chr != '\n'));
return scanval();
}
return x;
}
请注意,我还检查输入是否有效,在这种情况下,有效输入scanf()
将返回1
,因此检查它也很重要。
您还需要从输入缓冲区中删除剩余的空格,您可以使用此
int chr;
while (((chr = getchar()) != EOF) && (chr != '\n'));
如果您没有检查有效输入,则在未初始化导致未定义行为时,您可能会访问x
。