【问题标题】:C: Scanf in while loop executes only onceC:while循环中的scanf只执行一次
【发布时间】:2014-11-13 22:03:26
【问题描述】:

我在 C 中尝试一些简单的东西,一个程序来获取交换并进行一些转换。 为了确保 scanf 获得正确的类型,我将它放入一个 while 循环中,它会继续要求输入,直到插入一个数字。 如果我输入一个字符而不是一个数字,它不会再次要求输入。

exRate = 0;
scanfRes = 0;

while(exRate <= 0){
    printf("Enter the exchange rate:");
    while(scanfRes != 1){
        scanfRes = scanf(" %f", &exRate);
    }


    if(scanfRes == 1 && exRate > 0){
        break;
    }

    printf("Exchange rate must be positive.\n");
}

更新:由于这是一项课程作业,我不应该使用教学材料之外的任何东西。当我向学术人员询问如何处理意外输入时,我得到的答案是我不应该考虑这种情况。

cmets 中的答案和帮助都很有用,我在所有有用的建议中加了 1。工作人员的回答使这个问题不再需要。

【问题讨论】:

  • 多想想你的循环逻辑。 scanf 如果读取成功则返回1;或 0 如果您输入了非数字,或 EOF 如果输入已关闭。最里面的while 循环没有任何意义
  • scanf() 发现无效输入时,它会推回并提前返回。您必须使用不是数字的字符,否则scanf 将始终因相同的错误输入而失败。
  • @AlexD:我想到了,但这是一个 C 课程作业,他们提供文件中的输入。如果我清除缓冲区,它将刷新我从输入文件中获得的所有输入。
  • @Dean 你检查了这个答案吗:stackoverflow.com/a/1716066/3246555?

标签: c scanf


【解决方案1】:

scanf() 结果的更改处理。

如果输入与预期不符,则需要读取有问题的输入数据或处理EOF

for (;;) {
    printf("Enter the exchange rate:");
    scanfRes = scanf("%f", &exRate);
    if (scanfRes == 0) {
      printf("Exchange rate must be numeric.\n");
      // somehow deal with non-numeric input, here just 1 char read & tossed
      // or maybe read until end-of-line
      fgetc(stdin);
    } else if (scanfRes == EOF) {
      // Handle EOF somehow
      return;   
    } exRate > 0){
      break;
    }
    printf("Exchange rate must be positive.\n");
 }

注意:不需要" %f" 中的" ""%f" 将占用前导空格。

【讨论】:

  • 没有什么比在这里寻求更好的 C 解决方案更让我喜欢的了。但是我应该遵循课程材料,并且只允许使用他们在大学里教授的功能和库。我正在与学术人员核实……也许他们没有考虑到这一点。
  • @dean 这里没有新的标准库函数,除了fgetc(),你的帖子还没有准备好。因此,我看不到“仅使用函数和库”是如何应用的。如果使用fgetc() 有问题,则将其替换为scanf("%*c") 以获得相同的效果。
猜你喜欢
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多