数组大小为5或更高打印输出不正确,但4或更小的大小完美

时间:2017-02-11 01:56:06

标签: c

我正在为一个类项目编写一个程序,它将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。矢量是相同的。

我很困惑为什么会这样。有些东西肯定是错的,但我不知道我的知识有限。

2 个答案:

答案 0 :(得分:1)

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

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

关于一些相关信息:

为了便于阅读和理解,1)始终缩进代码。在每个开口支撑'{'后缩进。在每个闭合支撑'}之前取消。建议每个缩进级别为4个空格。

变量名称应指明usagecontent或更好,两者。

当调用任何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;
}