我查看了网站,找到了一种方法来获取包含数据的数组元素的数量。我所能找到的只是使用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;
}
答案 0 :(得分:2)
int arr[] = {1, 2, 3, 4, 5};
size_t size = ( (char *)(&arr + 1) - (char *) (&arr) ) / sizeof arr[0];
printf("%zu\n", size);
要重复使用,您可以编写如下的宏
#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]
在数组结束后返回索引的地址。减去数组的地址会返回元素的数量
(请参阅稍微不那么笨拙的解释的链接)。