【问题标题】:How to reject a non-numeric input in this code?如何拒绝此代码中的非数字输入?
【发布时间】:2020-08-27 20:00:14
【问题描述】:

我尝试使用 scanf 的值,但代码运行不正常。

#include<stdio.h> 
#include<math.h>

int main() {
  float dollars;
  int p, i = 0, count = 0;
  do {
    printf("Change owed:");
    scanf("%f", &dollars);
    if (dollars < 0) {
      printf("Foo\n");
    }
  } while (dollars < 0);

  int cents = round(dollars * 100);
  int denom[] = {25, 10, 5, 1};
  while (cents >= 1) {
    if (cents >= denom[i]) {
      count++;
      cents = cents - denom[i];
    } else {
      i++;
    }
  }
  printf("%d\n", count);
  return 0;
}

【问题讨论】:

  • 请提供minimal reproducible example。看起来像是在粘贴过程中堆肥的行尾。
  • “无法正常运行”是什么意思?
  • 不要对货币美元使用浮点数。而是使用 int 表示美分。
  • 您说您“尝试使用 scanf 的值”,但在您的代码中您完全忽略了 scanf 返回的值。

标签: c


【解决方案1】:

如何拒绝此代码中的非数字输入?

检查scanf("%f", &amp;dollars);的返回值。使用getchar()直到行尾读取该行的其余部分,然后在扫描计数为0时再次读取。

int cnt;
do {
  cnt = scanf("%f", &dollars);
  if (cnt == EOF) {
    return 0; // no input
  }
  int ch;
  while ((ch = getchar()) != '\n') && ch != EOF) {
    ;
  }
} while (cnt == 0);
...

【讨论】:

    【解决方案2】:

    看这里的技巧:scanf 返回成功读取变量的数量。如果以整数形式处理货币会更好(例如:1 美元 = 100 美分,因此 1.85 美元 = 185 美分)。

    如果你提供一个整数,它不会读取点和分部分(假设应该是 0 可能?)。

    如果它至少无法读取整数部分,则报告错误。

    int main() 
    {
       int dolar, cent = 0, read;
       read = scanf("%d.%d", &dolar, &cent);
       if(read < 1)
           printf("You didnt provide input in a valid format\n");
       else
           printf("Number provided was: %d.%d\n", dolar, cent);
    }
    

    【讨论】:

    • 由于 OP 正在寻找弹性输入检测,像 "123.4" 这样的输入将形成 123.04 美元。 "123. 45" 形成 $123.45,"123.-12" 形成 $122.88 "-123.45" 形成 $-122.55。 "%d.%d" 方法使得scanf("%f", &amp;dollars); ... int cents = round(dollars * 100.0); 处理的额外并发症足够好
    • scanf()返回的值不是读取的字符数。它是分配给变量的成功转换的数量——这意味着不会计算诸如%*d 之类的分配抑制转换(%n 也不会计算在内,但这是一种不同的特殊情况)。该值也可能是 EOF。对于scanf("%d.%d", …);,返回值可能是EOF、0、1、2。请注意,输入10.9 将得到与10.09 相同的结果,因此您可能会遇到问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多