【问题标题】:"return false" is neglected and not being returned"return false" 被忽略不被返回
【发布时间】:2020-03-23 10:45:31
【问题描述】:

注意:我已编辑我的代码以提供清晰且最少的步骤来重现错误。 我使用 C99 标准编写了以下代码:

#include <stdio.h>
#include <stdbool.h>

bool FillMatrix(int MatrixSize, int Matrix[][10])
{
    int CellValue=0;
    for (int i=0;i<MatrixSize;i++)
    {
        for (int j = 0; j < MatrixSize; j++)
        {
            if (scanf("%d",&CellValue) == 0)//Check if User provided un-integer value
            {
                printf("Error\n");
                return false;//Her's the problem
            }
            else
            {
                Matrix[i][j] = CellValue;
            }
        }
    }
    return true;
}

int main()
{
    int MatrixSize=0;
    scanf("%d",&MatrixSize);
    int FirstMatrix[10][10],SecondMatrix[10][10];
    printf("First:\n");
    if (!FillMatrix(MatrixSize,FirstMatrix)) return 0;
    printf("Second:\n");
    if (!FillMatrix(MatrixSize,SecondMatrix)) return 0;
    printf("Hello");
    return 0;
}

当我提供1 作为第一个输入,然后提供4.5 时,我可以在屏幕上看到Error,但也可以看到Second: 我的代码有什么问题? 在打印 Second 之前,我要求验证 FillMatrix(...) 没有返回 false,但它仍然会被打印出来!

【问题讨论】:

  • 旁白:if (scanf("%d",&amp;CellValue) == 0) 应该是 if (scanf("%d",&amp;CellValue) != 1),因为您将无法检测到何时返回 EOF。但是您应该发布 Minimal Reproducible Example 来表明问题,因为任何事情都可能是负责任的。
  • 出于好奇,print_invalid_input 是做什么的?
  • @edtheprogrammerguy 我已经完全重新排列了我的代码,使其更加清晰和简洁。你能看一下吗?
  • 请注意Minimal Reproducible Example应该是一个完整的程序,可以在一次操作中复制粘贴,然后编译(没有警告)并运行!
  • 重新排序函数时,无法重现。可能您的编译器不够严格,无法拒绝编译,并且传递的数组参数被错误地使用,从而破坏了某些东西。在默认情况下,它可能传递了一个被截断为 32 位 int 而不是 64 位指针的指针

标签: c function return main c99


【解决方案1】:

如果我正确理解您的错误,您似乎在输入 1 时出现错误,该值成为 MatrixSize 的值,然后当您输入 4.5 时。由于 MatrixSize 为 1,因此您的代码将扫描 4 以查找第一个矩阵中的值(也是唯一值)。然后该函数将返回 true,并且由于未检测到错误,将使用第二个矩阵调用 FillMatrix。 .5 仍然存在于标准输入中,这就是产生错误的地方(第二个矩阵的 FillMatrix 调用中的第一个 scanf)。

您提到的问题只会出现在矩阵的最后一个输入中。避免此问题的一种方法是将输入作为字符串读取并检查是否可以将其解析为整数。

【讨论】:

  • 好地方。我可以重现那个。 1 是要输入的元素数,而不是第一个数据。 OP 的教训是提供提示,因为即使是程序自己的作者也会感到困惑。
  • 为什么函数会返回 true,当我提供 4.5 作为输入时,scanf 将返回 0,这意味着应该打印“错误”短语并返回 false。 @WeatherVane
  • 我认为这已经解释得很好了。第一个函数没有返回错误,第二个函数返回了。如果您希望第一个函数返回错误,请输入 2 4.5 而不是 1 4.5
  • @WeatherVane 对不起,我用干净的代码重新检查了它,它没有输入我的代码,它只是去了别的地方!但这是为什么呢?用户提供的 4.5 不是整数,这意味着 scanf 应该返回 0
  • 4 是一个整数,它在下一次读取时失败,如此处所述。
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多