我正在为一个类项目编写一个程序,它将2个数组相乘并输出一个向量。在它将2个数组相乘之后,它还会检查2个数组输入是否相等,如果它们是否相等则输出。
我遇到的问题是,如果数组大小为5或更高,则输出开始不正确地增加,我不明白为什么。
代码已移除
这是一个输出错误的例子。我执行程序,它会提示矢量大小。用户输入5.然后询问进入第一个数组的内容。输入为1, 2, 3, 4, 5
。它要求第二个阵列。输入也是1, 2, 3, 4, 5
。然后它计算向量和输出5, 4, 9, 16, 25
,然后说向量不相等。这是不正确的。
但是当它发生时:矢量大小4.首先输入1,2,3,4
。第二个输入1, 2, 3, 4
。它输出1, 4, 9, 16
。矢量是相同的。
我很困惑为什么会这样。有些东西肯定是错的,但我不知道我的知识有限。
答案 0 :(得分:1)
数组的声明,如v1[n]
和v2[n]
以及v3[]
必须在变量n
收到有效值后声明。
发布的代码试图在知道它们必须有多大之前声明这些VLA。
关于一些相关信息:
为了便于阅读和理解,1)始终缩进代码。在每个开口支撑'{'后缩进。在每个闭合支撑'}之前取消。建议每个缩进级别为4个空格。
变量名称应指明usage
或content
或更好,两者。
当调用任何scanf()
系列函数时,请始终检查返回值(而不是参数值)以确保操作成功。 (请参阅man
)的scanf()
页面
遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。
答案 1 :(得分:1)
您的代码中存在一些问题:
必须在 n
收到用户输入的值后定义向量。目前,该程序具有未定义的行为,可能导致其行为有时像预期的那样,在某些其他时间以不同的方式行事,或崩溃或其他任何行为,无论您输入什么类型。
比较函数有点不正确:它应该为空向量返回1。它可以简化如下所示。
C中布尔值的约定为0
表示为false,其他任何表示为true。仅测试eq_check == 0
并使用else
子句。
以下是修改后的版本:
#include <stdio.h>
void multi_vec(const int v1[], const int v2[], int v3[], int n);
int comp_vec(const int v1[], const int v2[], int n);
int main(void) {
int i, n, eq_check;
printf("Enter the length of the vectors: ");
if (scanf("%d", &n) != 1 || n <= 0) {
printf("Invalid length\n");
return 1;
}
int v1[n], v2[n], v3[n];
printf("Enter the first vector:\n");
for (i = 0; i < n; i++) {
if (scanf("%d", &v1[i]) != 1) {
printf("Invalid input\n");
return 1;
}
}
printf("Enter the second vector:\n");
for (i = 0; i < n; i++) {
if (scanf("%d", &v2[i]) != 1) {
printf("Invalid input\n");
return 1;
}
}
multi_vec(v1, v2, v3, n);
printf("The multiplication of the vectors is: ");
for (i = 0; i < n; i++) {
printf("%d ", v3[i]);
}
printf("\n");
eq_check = comp_vec(v1, v2, n);
if (eq_check == 0) {
printf("The vectors are not the same\n");
} else {
printf("The vectors are the same\n");
}
return 0;
}
void multi_vec(const int v1[], const int v2[], int v3[], int n) {
for (int i = 0; i < n; i++) {
v3[i] = v1[i] * v2[i];
}
}
int comp_vec(const int v1[], const int v2[], int n) {
for (int i = 0; i < n; i++) {
if (v1[i] != v2[i]) {
return 0;
}
}
return 1;
}