C中数组中的元素数,没有sizeof

时间:2014-07-20 03:33:45

标签: c arrays loops iteration elements

我查看了网站,找到了一种方法来获取包含数据的数组元素的数量。我所能找到的只是使用sizeof的人,但由于教师对我们可以访问的内容有限制,这对我来说不是一个选择。我需要一种在循环中执行此操作的方法,最好是在我从中读取数据的相同循环。

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

#define SIZE 10

int readData();

int
main(void)
{
double data[SIZE];
int size;

readData(double data[], &size);

return 0;

}

int readData(double data[], int* size)
{
FILE* fp;
fp = fopen("data.txt", "r");
int i;

for (i = 0; i < SIZE; i++)
{
    if( fscanf(fp, "%lf", &data[i]) < 1)
    break;
    if(data[i] < 0)
        printf("Negative data at %d\n", i);
}
size = i;

printf("The array is: ");
for (i = 0; i < size; i++)
{
    printf("%f ", data[i]);
}
fclose(fp);

printf("\n\n");

return;
}

2 个答案:

答案 0 :(得分:2)

int arr[] = {1, 2, 3, 4, 5};
size_t size = ( (char *)(&arr + 1) - (char *) (&arr) ) / sizeof arr[0];
printf("%zu\n", size);

live code here

要重复使用,您可以编写如下的宏

#define ARR_SZ(ARR) ( ( (char *)(&ARR + 1) - (char *) (&ARR) ) / sizeof ARR[0] )

修改
如果您在运行时从文件中读取数据,则可以跟踪成功读取的数据,这将是数组的大小。

size_t size = 0;
while( fread(arr + size, sizeof arr[0], 1, fp) ) ++size;

size将包含成功阅读项目的计数。

<强> EDIT2
返回大小的Here is a live code example是修改后的代码。

int readData(double data[], int size)   /* Change return type */
{
    FILE* fp;
    fp = fopen("data.txt", "r");
    int i;

    for (i = 0; i < size; i++)
    {
        if( fscanf(fp, "%lf", &data[i]) < 1) break; /* Added */
        if(data[i] < 0)
            printf("Negative data at %d\n", i);
    }
    size = i; /* Added */

    printf("The array is: ");
    for (i = 0; i < size; i++)
    {
        printf("%f ", data[i]);
    }
    fclose(fp);
    printf("\n"); /* Added */

    return size; /* Added */
}

在上面的示例中,您可以增加或减少输入数量。

答案 1 :(得分:2)

使用this问题中的信息:

int size = (&data)[1] - data;

[1]&data视为数组。通过从索引0的位置开始,添加索引号乘以元素的大小并取消引用结果来索引数组。
因为在这种情况下元素是原始数组,(&data)[1]在数组结束后返回索引的地址。减去数组的地址会返回元素的数量 (请参阅稍微不那么笨拙的解释的链接)。