【问题标题】:why isn't fscanf() working?为什么 fscanf() 不工作?
【发布时间】:2013-06-03 18:03:57
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int test, l , b, sqr, area, sqra, num;
    fscanf(stdin, "%d", &test);
    while(test--) {
        fscanf(stdin, "%d %d", &l, &b);    //input:
        area = l * b;                      //2
        sqr = sqrt(area);                  //2 2
        sqra = sqr * sqr;                  //7 9
        while(sqr) {
            if(!(area % sqra)) {
                num = area / sqra;
                --sqr;
                break;
            }
        } 
        fprintf(stdout, "%d\n", num);
    }
    return 0;
}

我的代码在 test >= 2 时不起作用。我认为问题出在 fscanf 上。你能解释一下为什么会这样吗?

【问题讨论】:

  • 您在哪里以及如何声明num?另外,如果area 的平方根小于一,那么sqr 中的结果将被截断为零(这意味着循环不会运行,num 很可能会包含一个随机值)。
  • 为了帮助您找到问题所在,我建议您在调试器中逐行运行程序,同时检查所有计算的结果。
  • 您应该提供一些示例输入。
  • 你能解释一下为什么 fscanf 不工作吗?
  • 由于您不测试来自fscanf() 的返回值,因此您不知道fscanf() 是否有效。您必须注意scanf() 系列函数(实际上是大多数输入函数)的返回值。 if (fscanf(stdin, "%d", &amp;test) != 1) ... process error...if (fscanf(stdin, "%d %d", &amp;l, &amp;b) != 2) ... process error....

标签: c scanf


【解决方案1】:

我认为它与 scanf 没有任何关系,例如:如果 l=2 和 b=3 则 area=6,sqrt(area) 是 int 所以它被四舍五入为 2,然后 sqra=4, area%sqra 是 6%4=2,所以它永远不会进入循环中的条件,从而创建一个无限循环。

您的示例中的第二个输入也是如此:7*9=63 => sqr=7 => sqra = 49 => area%sqra=14。再次,无限循环。

【讨论】:

  • 我有 --sqr 循环。最后我会得到 sqr = 1,因此 6%1 = 0
  • 不在您发布的代码中。在您的代码中,--sqr 仅在条件评估为 true 并且 l=7,b=9 不会发生时才会发生
【解决方案2】:

你真的应该使用scanf,而不是fscanf,还有,你在哪里声明了num?我很惊讶它完全可以编译。此外,如果您的区域不能被 sqra 整除,则会出现无限循环。 (比如边长为 3 和 7 的矩形)

【讨论】:

  • num 被声明(它是最后一个变量)
【解决方案3】:

[在声明 num 之后] 您的 fscanf 工作正常:

    fscanf(stdin, "%d %d", &l, &b);
    printf("inp: %d %d\n",l,b);

尝试打印用户输入。有用。您的代码逻辑错误,因此只有您没有得到预期的结果。

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多