【问题标题】:Death loop, maybe it's the scanf死循环,也许是 scanf
【发布时间】:2016-01-17 22:55:48
【问题描述】:
scanf("%d", &jogadores[pos].dados[4][2]);
while (jogadores[pos].dados[4][2] < 0) {
    printf("O valor não pode ser menor que 0, introduz novamente: ");
    scanf("%d", &jogadores[pos].dados[4][2]);
};

你知道这段代码有什么问题吗,我认为它跳过了第一个scanf,因为它一直在打印O valor não pode ser menor que 0, introduz novamente:

【问题讨论】:

  • 我猜,这是你的问题。 &jogadores[pos].dados[4][2]
  • 始终检查来自scanf 的函数返回值。这里应该是1
  • @TonyTannous:我们不知道jogadores[pos].dados[4][2]的类型,但如果是int,问题就出在其他地方。
  • @chqrlie 他只给了我们 4 行代码。在这 4 行代码中,除了他保存和读取的地址之外,没有任何可疑之处。
  • @TonyTannous:是的,有!在这 4 行中的 2 行中,他未能测试 scanf 的返回值。这就是错误行为的原因所在,例如无限循环。修复需要超过 4 行,但只调用一次 scanf

标签: c loops scanf


【解决方案1】:

您无法通过检查输出变量来检查 scanf 解析输入是否成功,您必须将返回值与预期的数字转换进行比较。此外,如果转换失败,有问题的字符会留在输入流中,因此在没有先读取它们的情况下再次调用 scanf 将再次失败,并且再次...

以下是修复代码的方法:

for (;;) {
    if (scanf("%d", &jogadores[pos].dados[4][2]) != 1) {
        int c;
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (c == EOF) {
            printf("unexpected end of file\n");
            exit(EXIT_FAIL);
        }
        printf("invalid input, try again (non falo brasileiro)\n");
        continue;
    }
    if (jogadores[pos].dados[4][2] < 0) {
        printf("O valor não pode ser menor que 0, introduz novamente: ");
        continue;
    }
    break;
}

【讨论】:

  • 一个问题是除非scanf("%d", &amp;jogadores[pos].dados[4][2]) 返回1,否则jogadores[pos].dados[4][2] 中的值是未知的。
  • @chux: 如果scanf 返回任何其他内容,则循环重新启动。看看第一个测试。
  • True' continue; 做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多