忽略“返回假”,不返回

时间:2019-11-27 19:56:29

标签: c function return main c99

注意:我已经编辑了我的代码,以提供重现错误的清晰而最少的步骤。 我使用C99 standrad编写了以下代码:

#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,但无论如何仍会打印出来!

1 个答案:

答案 0 :(得分:2)

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

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