正值输入 C

Positive value input C

这个函数的想法是要求一个正值,并确保不会使用递归插入一个负值。

然而,当我测试它时,如果我输入的第一个值是负数,而函数工作并且在输入正值之前不允许代码继续,代码仍然打印插入的第一个值,无论如果它满足 return.

的要求
#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());
}

首先认识到递归不是适合这里的技术。
您应该使用 while 循环。

但是如果您出于任何作业目的需要递归:

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;
}

也许你应该记得保存 return 值:

x = scanval()

函数内部。

您应该能够轻松完成以下操作:

    if(x<0){
    printf("Not a valid value \n");
    return scanval();
  }

当然,最佳做法是在一个函数中只包含一个 return,但我认为您不会关心这一点,因为您正试图通过递归来完成此任务!

你可以做的另一件事是这个

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() 将 return 1,因此检查它也很重要。

并且您还需要从输入缓冲区中删除剩余的空格,为此您可以使用这个

int chr;
while (((chr = getchar()) != EOF) && (chr != '\n'));

如果您不检查有效输入,您可能会在 x 未初始化时访问它,从而导致未定义的行为。