C 数组大小为5或更高的打印输出不正确,但大小为4或更低的打印输出效果最佳

C 数组大小为5或更高的打印输出不正确,但大小为4或更低的打印输出效果最佳,c,C,我正在为一个类项目编写一个程序,它将两个数组相乘并输出一个向量。在将两个数组相乘后,它还会检查两个数组输入是否相等,以及输出是否相等 我遇到的问题是,如果数组大小为5或更大,则输出开始错误地相乘,我不明白为什么 代码已删除 因此,它的输出错误的例子。我执行程序,它会提示输入向量大小。用户输入5。然后它询问进入第一个数组的内容。输入是1,2,3,4,5。它要求第二个数组。输入也是1,2,3,4,5。然后它计算向量并输出5、4、9、16、25,然后说向量不相等。这是不正确的 但当它消失时:向量大小为

我正在为一个类项目编写一个程序,它将两个数组相乘并输出一个向量。在将两个数组相乘后,它还会检查两个数组输入是否相等,以及输出是否相等

我遇到的问题是,如果数组大小为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
。向量是相同的


我很不明白为什么会这样。一定是出了什么问题,但以我有限的知识我看不出来

数组的声明,如
v1[n]
v2[n]
v3[]
必须在变量
n
收到有效值后声明

发布的代码试图在知道VLA必须有多大之前声明这些VLA

关于一些相关信息:

为了便于阅读和理解,1)始终缩进代码。在每个左大括号“{”之后缩进。在每个右大括号“}”之前取消缩进。建议每个缩进级别为4个空格

变量名称应表明
用法
内容
或更好,二者兼而有之

调用任何
scanf()
函数族时,始终检查返回值(而不是参数值),以确保操作成功。(有关
scanf()
,请参见
man
页面)


遵循公理:每行只有一条语句,每条语句(最多)有一个变量声明。

代码中存在一些问题:

  • 必须在
    n
    收到用户键入的值后定义向量。目前,程序有未定义的行为,这可能导致它有时按预期的方式运行,有时以不同的方式运行,或者崩溃或其他任何情况,而不管您输入什么

  • 比较函数有点不正确:空向量应该返回1。它可以简化如下所示

  • C中布尔值的约定是
    0
    表示false,其他任何值都表示true。仅当
    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 | | n
eq|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语言中做的第二件事,我的课堂在解释一些更简单的指导原则方面真的没有那么大帮助。非常感谢。非常感谢。这确实帮助我澄清了一些问题。我感谢你的帮助。