【问题标题】:How to pass this test case? Can someone also explain what I was missing?如何通过这个测试用例?有人也可以解释我错过了什么吗?
【发布时间】:2021-06-16 16:15:37
【问题描述】:

这是测试器功能:

intA = intB = 0;

printf("TEST-2: ");
intA = getIntPositive(NULL);
if (intA == TEST_INT)
{
    printf("<PASSED>\n");
}
else
{
    printf("<!!! FAILED !!!>\n");
    fail++;
}

这是我编写的获取正整数并返回它的函数:

int getIntPositive(int *num) {
do
{       
    scanf("%d", num);

    if (*num <= 0)
    {
        printf("ERROR: Enter a positive value:");
    }
} while (*num <= 0);
return *num;
}

【问题讨论】:

  • 您也必须检查scanf() 的函数返回值(在检查输入的值之前)并删除任何阻止读取的错误输入。例如非数字条目,例如 abc,它将保留在输入中,直到您采取措施将其删除。
  • edit 并显示minimal reproducible example 以及一些样本(如果输入和预期与实际输出)
  • 您知道使用NULL 参数调用getIntPositive 不会有好的结果吗?
  • 为什么将指针传递给目标并且也返回值?

标签: c pointers nullpointerexception void-pointers


【解决方案1】:

您展示的测试不完整(它没有完全测试功能),并且您展示的内容不完整(您没有展示提供给功能的输入)。您也没有显示函数的规范(对它应该如何表现的描述)。

从您展示的测试代码中我们可以看出:

  • 函数被传递一个指针参数。
  • 在某个输入未知且带有空指针参数的测试用例中,函数应返回值TEST_INT

从您为getIntPositive 显示的源代码中,我们可以看出它很可能无法通过这个测试用例,因为它使用给定的参数来访问内存,即使给定了一个空指针。对于scanf("%d", num);scanf 必须传递一个指向int 的指针,而不是一个空指针。而且,在if (*num &lt;= 0) 中,当num 为空指针时使用*num 的行为未由C 标准定义。

解决此问题的一种方法是简单地忽略该参数并使用另一个int 从输入流中获取一个值并返回它:

int getIntPositive(int *num)
{
    do
    {       
        int x;
        scanf("%d", &x);

        if (x <= 0)
        {
            printf("ERROR: Enter a positive value:");
        }
    } while (x <= 0);
    return x;
}

此代码可能会通过该特定测试。但是,仍有几个问题没有得到解答:

  1. 当参数是空指针时代码应该做什么?当参数不是空指针时应该怎么做?
  2. 函数是否应该循环直到它得到一个正值?
  3. 如果输入流中有错误(包括文件结尾)或scanf 匹配失败(有输入,但与十进制数字的外观不匹配),该函数应该怎么做)。

在问题 1 中,一些接受指针并返回值的函数将值作为函数返回值和指向的位置提供,如果指针为空,它们会跳过该部分。如果是这样,最后可以修改上面的代码:

    if (num)
        *num = x;
    return x;
}

但是,另一种可能性是扫描的值应该在*num 中返回,如果num 不为空,并且返回值应该是状态码。如果一个数字被成功扫描,它可能应该是 0;如果匹配失败,它应该是 TEST_INT,或者如果输入流错误,它应该是其他东西。

同样,关于问题 2 和 3,我们不知道。编写一个正确的函数需要有一个函数应该做什么的规范。我们甚至不知道这个测试用例中的输入是什么。它是文件末尾的空输入流吗?输入的是一些负数后跟一个正数吗?输入的内容是否与十进制数字完全不匹配?您所展示的有关测试用例的内容中缺少关键信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多