c - 关于C中数组的各种问题

标签 c arrays scanf

所以我现在正在尝试学习 C,并且我正在编写基本脚本以确保我有基础,但我正在努力理解以下代码的问题:

#include <stdio.h> //Linking external libraries.
#include <math.h>

int main(void) {
    /* First I will set my variables.
    */
    double std; //Standard Deviation
    double sqdif;
    double avg;
    int N=10; //number of elements
    double X[10]; //Not sure why I cannot use N here.
    int i;


    /* Now I will prompt for input and listen for values,
    then assign those values respectively.*/

    for (i = 1; i < 11; i++) {
        printf("Please enter X[ %d ", i);
        printf("]: ");
        scanf("%d", &X[i-1]);
    }

    for (i = 0; i < N; i++) {
        avg = avg + X[i];
        printf("\n %d", X[i]);
    }
    avg = avg / N;
    printf("\nThe average is: %d", avg);


    return 0;
}

我的两个主要问题是这样的:

  1. 为什么我不能使用 N 来定义我的数组 X?
  2. 为什么我的脚本返回:

1 4196197 4196197 4196197 4196197 4196197 4196197 4196197 4196197 4196197 The average is: 4196197

我的结果?如果您看到代码中的错误,请告诉我!

谢谢,

附言。这显然是一个不完整的脚本。

最佳答案

Why can I not use N to define my array X?

在 1999 标准之前,必须使用常量表达式指定数组大小,其值可以在编译时计算;这意味着要么是一个数字文字,例如 10,一个预处理器宏,它将扩展为一个数字文字,例如#define N 10,或者一个涉及文字或扩展为文字的宏的算术表达式:

#define X 10
...
int arr1[X];     
int arr2[2 * X];
int arr3[10];
int arr4[2 * 4 + 2];

X2 * X102 * 4 + 2 都是常量表达式, 并且可以在编译时求值。

在您的代码中,N 不是常量表达式;它只是一个常规变量,其值直到运行时才确定。

C99 引入了可变长度数组 的概念,其大小可以在运行时确定。如果您使用的是 C99 编译器(例如带有 -std=c99 选项的 gcc),那么您的代码将会编译。 Visual Studio 对 C99 的支持充其量是最少的,我认为当前版本根本不支持 VLA。

VLA 有许多限制;您不能对它们使用初始化程序,也不能在文件范围内(在任何函数之外)声明它们。您要小心使用它们,因为它们的内存像任何其他本地 (auto) 变量一样从堆栈中分配。

2011 C 标准使 VLA 成为可选(我的理解是正确实现它们是一个主要的痛苦),因此它们可能不会得到很好的支持。

Why is my script returning: 1 4196197 4196197 4196197 4196197 4196197 4196197 4196197 4196197 4196197 The average is: 4196197

正如其他人所指出的,您在 printfscanf 调用中使用了错误的转换说明符。 %d 期望相应的参数具有类型 int(对于 printf)和 int *(对于 扫描)。您需要使用 %f%lf 代替:

scanf("%lf", &X[i-1]);  // %lf expects pointer to double
...
printf("%f", X[i-1]);  // %f expects double

请注意,printfscanf 中的转换说明符不是对称的,这是一个很重要的情况。要读取double,您必须使用%lf;常规 %f 期望相应的参数是指向 float 的指针。但是,您可以使用 %f 来打印 double 或 float 。

查看您手边的 C 语言引用手册以了解这两个函数。

你还需要初始化avg:

double avg = 0.0;

关于c - 关于C中数组的各种问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28049869/

相关文章:

c++ - 有人可以解释 malloc(20 * c | -(20 * (unsigned __int64)(unsigned int)c >> 32 != 0)) 的含义

c++ - 数组初始化编译时间 - Constexpr 序列

c - 无法通过 scanf 正确分配值

php - 在生产代码中使用系统函数

c - 如何组合 2 个整数以获得 1?

C 程序读取 2 个数字,从中确定范围并验证它是否为正数?

php - 在 PHP 中从两个并行索引数组创建关联数组的最直接方法是什么?

python - 通过平均多个单元格来简化矩阵

c - scanf ("...%n",...) 匹配失败

c++ - sscanf 在 MSVC++ 15+ 中有变化吗?