【问题标题】:Getting unexpected input request收到意外的输入请求
【发布时间】:2021-10-04 04:39:19
【问题描述】:

我是初学者,我正在学习 C 编程语言。我正在尝试编写一个将两个矩阵相乘的程序。

我正在接受两个输入。第一个用于行,第二个用于列。两个矩阵的行和列将是相同的。所以我只接受一次行和列输入。

对于第一个矩阵,输入工作正常。但是对于第二个矩阵,它比第一个输入需要更多的输入。在我的测试用例中,行数为 2,列数为 3。

我的 C 代码:

#include <stdio.h>

void matrixInput(int matrix[][10], int row, int column, int matrixNo) {
  printf("Matrix %d input:\n", matrixNo);

  for (int i = 0; i < row; i++) {
    for (int j = 0; j < column; j++) {
      printf("Matrix %d [%d, %d]: ", matrixNo, i + 1, j + 1);
      scanf("%d", &matrix[i][j]);
    }
  }

  printf("\n");
}

void matrixDisplay(int matrix[][10], int row, int column, int matrixNo) {
  printf("Matrix %d output:\n", matrixNo);

  for (int i = 0; i < row; i++) {
    for (int j = 0; j < column; j++) {
      printf("%d ", matrix[i][j]);
    }
    printf("\n");
  }

  printf("\n");
}

int main() {
  int row, column;

  printf("Row: ");
  scanf("%d", &row);
  printf("Column: ");
  scanf("%d", &column);

  int matrix1[row][column], matrix2[row][column];

  matrixInput(matrix1, row, column, 1);
  matrixInput(matrix2, row, column, 2);
  
  matrixDisplay(matrix1, row, column, 1);
  matrixDisplay(matrix2, row, column, 2);

  return 0;
}

当我使用void matrixInput(int matrix[row][column], int row, int column, int matrixNo) 时,出现以下错误:

error: 'row' undeclared here (not in a function)
error: 'column' undeclared here (not in a function)

我该如何解决这个问题?

【问题讨论】:

  • 请一次问一个问题。 “我该如何解决这个问题?” 那么什么是“这个问题”呢?输入不正确还是编译时错误?此外,对于不正确的输入,请提供准确的运行日志,以明确“接受更多输入”的含义。
  • 我认为int matrix1[row][column], matrix2[row][column];,这个内存是在构建过程中分配的,所以rowcolumn 有垃圾值或未知。您必须为matrix1matrix2 动态分配内存。
  • 请注意,如果你有两个大小为 NxM 的矩阵,只有当 N 等于 M 时才能将它们相乘。一般来说,你可以将一个 NxM 矩阵与一个 MxP 矩阵相乘;第一个矩阵中的列数必须与第二个矩阵中的行数匹配。
  • @shubham 这不正确。 OP 正在使用 Variable Length Arrays (VLA),这是一个 c99 功能(并且可选地在 C11 中支持)。

标签: c


【解决方案1】:

函数matrixInputmatrixDisplay的参数int matrix[][10]错误。您不应使用任意大小,而应等于 column

因此,你应该改变

int matrix[][10]

int matrix[][column]

在两个函数原型中。

但是,您只能在声明 column 后执行此操作。因此,您还必须更改参数的顺序。例如,您可以更改

void matrixInput(int matrix[][10], int row, int column, int matrixNo)

void matrixInput(int row, int column, int matrix[][column], int matrixNo)

并相应地更改函数调用。

【讨论】:

  • 改成void matrixInput(int rows, int cols, int matrix[rows][cols], int matrixNo)后,该函数只接受输入1次。
  • @SatyajitRoy:你是否也改变了mainmaxtrixInput的函数调用,以反映参数顺序的变化?
【解决方案2】:

你有函数签名:

void matrixInput(int matrix[][10], int row, int column, int matrixNo);
void matrixDisplay(int matrix[][10], int row, int column, int matrixNo);

但您传递给函数的数组没有 10 列。

您应该使尺寸匹配:

void matrixInput(int rows, int cols, int matrix[rows][cols], int matrixNo);
void matrixDisplay(int rows, int cols, int matrix[rows][cols], int matrixNo);

我已经重命名了大小变量并在使用它们之前放置它们——使用 C99 可变长度数组 (VLA) 表示法。重命名它们是可选的;在数组定义中使用之前定义大小是强制性的。显然,您还必须修复您的函数调用。

您可以将函数定义/声明中的[rows] 下标替换为[],但我认为指定两个维度会更清楚。

请求的额外输入可能是因为您调用了未定义的行为,因为数组大小不匹配。很有可能第一个输入已经覆盖了一些关键数据。您可以尝试在进入(也可能退出)matrixInput() 函数时打印 rowscols(或命名约定中的 rowcolumn)。这样做可能会向您表明存在问题。详细了解发生的事情没有多大意义。未定义的行为是不稳定的,并且可能在编译器或单个编译器的版本之间有所不同(甚至在同一编译器的编译之间 - 尽管这在实践中是不寻常的)。您也可以考虑在输入后打印第一个数组;您可能会对在输出中看到的内容感到惊讶。通过匹配大小来解决问题。

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2023-03-15
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多