【问题标题】:Number of elements in an array in C, without sizeofC中数组中的元素数,没有sizeof
【发布时间】:2014-07-20 03:33:45
【问题描述】:

我浏览了该站点以找到一种方法来获取包含数据的数组的元素数量。我只能找到使用 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;
}

【问题讨论】:

  • 你知道数组的大小,它是size
  • 数组正在从一个可以包含 1-SIZE 的文件中读取,因此我需要能够使程序适应该范围内的任何内容。
  • 你需要检查fscanf是成功还是失败。然后你需要return i 在失败时的状态。 (所以你的函数返回int 而不是void
  • 将大小存储在变量中并使用它
  • 您需要重新表述问题。数组的大小与你存储在数组中的元素个数不同。

标签: c arrays loops iteration elements


【解决方案1】:

使用来自this问题的信息:

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

[1]&amp;data 视为一个数组。数组的索引是从索引 0 的位置开始,加上索引号乘以元素的大小,然后取消引用结果。
因为本例中的元素是原始数组,所以(&amp;data)[1] 返回数组末尾之后的索引地址。减去数组的地址返回元素个数。
(请参阅链接以了解措辞不那么笨拙的解释)。

【讨论】:

    【解决方案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 */
    }
    

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

    【讨论】:

    • 为了完整起见,也编辑了上面的代码,也许它会更有意义
    • 我尽我所能地调整了这段代码,并且由于某种原因,当我尝试测试 main 中的 size 值时(通过 printf("The size of size is %d", size) ;) 上面写着 1989992264。
    • 我已经设法让它变得更合乎逻辑,现在是 49,但我觉得这只是 int 形式的字符 s 的 ASCII 码。
    • 感谢您的所有帮助,您非常乐于助人,非常周到!
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2010-12-26
    • 2013-05-15
    相关资源
    最近更新 更多