在函数中使用scanf和循环

时间:2013-12-10 20:42:01

标签: c function loops if-statement scanf

我想使用一个函数来询问用户是否有余额。如果余额低于0,则提示用户输入大于0的值。这是我到目前为止所做的代码:

#include <stdio.h>
#include <string.h>

float getPositiveValue();
int main()
{
  float begbal;
  begbal = getPositiveValue();
  getPositiveValue();
  printf("balance: %f\n", begbal);

  return 0;
}

float getPositiveValue()
{
  float money;
  printf("Please enter the beginning balance: \n");
  scanf("%f", &money);
  if(money < 0)
  {
    printf("Enter a balance amount above 0:");
    scanf("%f", &money);
  }else{

  }
}

我收到错误“警告:控制到达非空函数的结尾”。我知道我需要结束else语句,但是如果输入的值超过0,则不确定要放在那里的内容。此外,当程序运行时,它会要求用户两次输入起始余额。看起来这应该是一个简单的解决方案,由于某种原因我无法理解函数heh。

任何帮助都非常感激。

修改后的工作代码(谢谢):

#include <stdio.h>
#include <string.h>

float getPositiveValue();
int main()
{
  float begbal;
  begbal = getPositiveValue();

  printf("balance: %f\n", begbal);

  return 0;
}

float getPositiveValue()
{
  float money;
  printf("Please enter the beginning balance: \n");
  scanf("%f", &money);
 while(money < 0)
  {
    printf("Enter a balance amount above 0:");
    scanf("%f", &money);
  }
        return money;
  }

5 个答案:

答案 0 :(得分:1)

  1. 您需要返回一个浮点值,因此在这种情况下,您可以返回money
  2. 您正在主函数中调用您的函数两次。

    begbal = getPositiveValue();
    getPositiveValue();
    

    删除最后一句话

答案 1 :(得分:1)

getPositiveValue()应该返回一个值(float)。您可以在结束前添加return money;

如果用户特别密集并且未输入正数,该怎么办?你想给他们一次机会吗?如果没有,您可能想要使用while (money < 0.0)循环。

答案 2 :(得分:0)

  

“此外,当程序运行时,它会要求用户两次输入   由于某种原因开始平衡。“

因为您调用了函数getPositiveValue()在您的代码中使用了两次

并且你的函数需要返回浮点值,在这种情况下是“money”。

答案 3 :(得分:0)

用户可能会坚持输入错误的内容,因此您需要一个循环来迭代,直到他们做对了。此外,您需要从此函数返回一个值。

float getPositiveValue()
{
    float money;
    fputs("Please enter the beginning balance: ", stdout);
    for (;;) {
        scanf("%f\n", &money);
        if (money >= 0)
            break;
        fputs("Balance must be nonnegative.\n"
              "Please enter the beginning balance: ", stdout);
    }
    return money;
}

但这只是冰山一角。 scanf should never be used,不应使用浮点数来跟踪资金。您应该真正在这里做的是阅读一行文字getline(或fgets,如果getline不可用),并使用{{解析它3}}和自定义逻辑,大概为[$] dddd [.cc](方括号表示可选文本),变为uint64_t值,缩放为美分。

答案 4 :(得分:0)

由于用户可能输入无效范围(负数)或非数字文本,因此需要在下次提示之前使用违规输入。

float getPositiveValue() {
  float money = 0.0;
  printf("Enter a balance amount above 0:");
  while ((scanf("%f", &money) != 1) || (money < 0)) {
    int ch;
    while (((ch = fgetc(stdin)) != '\n') && (c != EOF));
    if (c == EOF) break;
    printf("Enter a balance amount above 0:");
  }
  return money;
}