C 数组大小为5或更高的打印输出不正确,但大小为4或更低的打印输出效果最佳
我正在为一个类项目编写一个程序,它将两个数组相乘并输出一个向量。在将两个数组相乘后,它还会检查两个数组输入是否相等,以及输出是否相等 我遇到的问题是,如果数组大小为5或更大,则输出开始错误地相乘,我不明白为什么 代码已删除 因此,它的输出错误的例子。我执行程序,它会提示输入向量大小。用户输入5。然后它询问进入第一个数组的内容。输入是C 数组大小为5或更高的打印输出不正确,但大小为4或更低的打印输出效果最佳,c,C,我正在为一个类项目编写一个程序,它将两个数组相乘并输出一个向量。在将两个数组相乘后,它还会检查两个数组输入是否相等,以及输出是否相等 我遇到的问题是,如果数组大小为5或更大,则输出开始错误地相乘,我不明白为什么 代码已删除 因此,它的输出错误的例子。我执行程序,它会提示输入向量大小。用户输入5。然后它询问进入第一个数组的内容。输入是1,2,3,4,5。它要求第二个数组。输入也是1,2,3,4,5。然后它计算向量并输出5、4、9、16、25,然后说向量不相等。这是不正确的 但当它消失时:向量大小为
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
。向量是相同的
我很不明白为什么会这样。一定是出了什么问题,但以我有限的知识我看不出来 数组的声明,如
v1[n]
和v2[n]
和v3[]
必须在变量n
收到有效值后声明
发布的代码试图在知道VLA必须有多大之前声明这些VLA
关于一些相关信息:
为了便于阅读和理解,1)始终缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}”之前取消缩进。建议每个缩进级别为4个空格
变量名称应表明用法
或内容
或更好,二者兼而有之
调用任何scanf()
函数族时,始终检查返回值(而不是参数值),以确保操作成功。(有关scanf()
,请参见man
页面)
遵循公理:每行只有一条语句,每条语句(最多)有一个变量声明。代码中存在一些问题:
- 必须在
收到用户键入的值后定义向量。目前,程序有未定义的行为,这可能导致它有时按预期的方式运行,有时以不同的方式运行,或者崩溃或其他任何情况,而不管您输入什么n
- 比较函数有点不正确:空向量应该返回1。它可以简化如下所示
- C中布尔值的约定是
表示false,其他任何值都表示true。仅当0
eq\u 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;
}
#包括
void multi_vec(常量int v1[],常量int v2[],int v3[],int n);
整数比较向量(常数整数v1[],常数整数v2[],整数n);
内部主(空){
整数i,n,等式检查;
printf(“输入向量的长度:”);
if(scanf(“%d”,&n)!=1 | | neq|u check
变量不是很有用;您可以通过删除它并在if
内执行返回0;
,在循环外返回1;
来简化您的函数。无论如何,问题是在v1[n]中设置VLA大小时,n
没有初始化
、v2[n]
和v3[n]
。在使用时声明,而不是在函数顶部。根据用户输入使用VLA大小通常也不是一个好主意,或者根本不使用VLA。将警告调高到迂腐的级别,不要忽略它们。警告适当升高int n,v1[n]…
应该会产生一个重要的警告。在clang 3.8中,可能是“变量'n'在这里使用时未初始化”。VLA是否是一个好主意是一个意见问题,我们中的一些人喜欢它们int n,v1[n]
是UB。首先解决这个问题。非常感谢你为我澄清了其中的一些问题。这只是我在C语言中做的第二件事,我的课堂在解释一些更简单的指导原则方面真的没有那么大帮助。非常感谢。非常感谢。这确实帮助我澄清了一些问题。我感谢你的帮助。