计算数组大小

时间:2014-11-24 22:33:15

标签: c arrays size

我有这段代码:

int main() {
    int array[5];
    int x;
    int n;
    for(x = 0; x != 5; x++) {
        scanf("%d", &n);
        if(n % 2 == 0) {
            array[x] = n;
        }
        printf("%d", sizeof(array))

我想知道数组中保存了多少变量。

鉴于用户已输入" 2,3,5,6,7,8"并且它只会得到" 2,6,8",有什么方法可以达到它的大小吗?

我能做到这一点的另一种方法是制作另一个int:

int main() {
    int array[5];
    int x;
    int g = 0;
    int n;
    for(x = 0; x != 5; x++) {
        scanf("%d", &n);
        if(n % 2 == 0) {
            array[x] = n;
            g++;
        }
        printf("%d", g);

如果不在if块内增加g,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您必须跟踪计数,否则您将不知道要为阵列使用什么索引。您当前的代码不起作用,因为您在偶数之间的数组中留下了空白:

    for (x = 0; x != 5; x++) {
        scanf("%d", &n);
        if (n % 2 == 0) {
            array[x] = n;
            g++;
        }

对于输入“2 3 5 6 7”,您将数字2存储在阵列中的位置0,将数字6存储在位置3.在其他位置存在随机数据。它们甚至不是零值,因为您在函数内声明了数组。顺便说一下,固定大小的数组应该在全局范围内声明,在任何函数之外。那是因为函数内部的变量被分配在堆栈帧中,这是一个小而瞬态的内存。你希望你的数组在堆上,这是一个大而长寿的。

以下代码包含几项改进。它定义了数组长度的常量,并在保存数字之前检查当前计数。 (如果您在数组末尾写入,则会发生错误。)此外,此代码对其将读取的数据量没有固定限制。它一直调用scanf,直到返回文件结束值EOF

#include <stdio.h>
#include <stdlib.h>

#define MAX_COUNT 1000

int even[MAX_COUNT];

int main() {
  int x,
      count = 0;                    /* Track the number of even numbers.   */
  while (scanf("%d", &x) != EOF) {  /* Get an integer from standard input. */
    if(x % 2 == 0) {                /* Is it even?                         */
      if (count == MAX_COUNT) {     /* If so, check the count first.       */
        printf("I have reached the limit of %d! I cannot store %d.",
            MAX_COUNT, x);          /* Fail gracefully if the array is     */
      } else {                      /*  full. Otherwise, we can go         */
        even[count++] = x;          /*  ahead and save the number.         */
      }
    }   
  }   
  printf("There are %d even numbers.\n", count);
  return 0;
}

答案 1 :(得分:0)

你需要自己跟踪这个。

也许通过使用一个额外的变量(如你在第二个例子中所示),或者使用一个你可以计算的标记值(比如我们如何在字符串中使用空字符)