无法计算数组中元素的数量
#include<stdio.h>
int counter(int arr[])
{
int c =0;
for (int i=0 ; arr[i]!= '\0'; i++)
{
c= c+1;
}
return c;
}
int main()
{
int a[] ={1,5,3};
int d = counter(a);
printf("%d ",d);
return 0;
}
任何人都可以帮助我如何获得 3 作为输出吗?
您的数组末尾需要有一个 sentinel 值(我选择了
0
但它可以是任何不会被视为有效数据的东西)。
#define SENTINEL 0
int counter(int arr[])
{
int c =0;
for (int i = 0 ; arr[i] != SENTINEL; i++)
{
c = c + 1;
}
return c;
}
int main()
{
int a[] = {1, 5, 3, SENTINEL};
int d = counter(a);
printf("%d\n",d);
return 0;
}
您尝试检查
\0
值作为数组的最后一个值,尽管它从未被声明过。
在 C 中查找数组长度的常用方法是使用
ARRAY_LENGTH
宏:
#include <stdio.h>
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
int main()
{
int a[] = {1, 5, 3};
printf("%u\n",ARRAY_LENGTH(a));
return 0;
}
顺便说一下,这一切都是在编译中完成的,因为
sizeof
在复杂时间是已知的,所以它更有效率:)
编译程序后,你会看到这样的东西(当然是伪的):
int main()
{
int a[] = {1, 5, 3};
printf("%u\n", 3);
return 0;
}
你声明了一个
int
类型的对象数组,它是按以下方式初始化的
int a[] ={1,5,3};
所以数组有三个元素,数组的两个元素都不等于
0
.
所以函数内的这个循环
for (int i=0 ; arr[i]!= '\0'; i++)
没有意义并导致未定义的行为。
此外这个函数声明
int counter(int arr[]);
由编译器调整为以下声明
int counter(int *arr);
即数组类型的参数调整为指向元素类型的指针。
为了使您的代码正常工作,您需要将数组的最后一个元素设置为
0
,例如
int a[] = { 1, 5, 3, 0 };
或者您可以在数组声明中明确指定等于
4
的元素数量,例如
int a[4] = { 1, 5, 3 };
在这种情况下,没有显式初始化器的最后一个元素将被隐式零初始化。即上面两个数组的声明是等价的
但是你的函数实际上不会返回数组中元素的数量。
返回数组中等于
0
的元素之前的元素数,前提是数组中确实存在这样的元素。但是,可以声明一个数组,其元素数量多于具有值 0
. 的元素的数量
所以总的来说你的方法是错误的。
函数中使用的 for 循环通常用于确定存储在字符数组中的字符串的长度,因为字符串是由零字符终止的字符序列
'\0'
.
这里有演示程序
#include <stdio.h>
size_t counter( const char s[] )
{
size_t n = 0;
for ( size_t i = 0 ; s[i] != '\0'; i++ )
{
++n;
}
return n;
}
int main( void )
{
char s[] = "Hello World!";
size_t n = counter( s );
printf( "The length of the string is %zu\n", n );
return 0;
}
但是整数数组可以有一个值为 0 的元素作为数组的实际元素。
所以你的方法行不通。
要确定您可以编写的数组元素的数量
#include <stdio.h>
nt main( void )
{
int a[] = { 1,5,3 };
size-t n = sizeof( a ) / sizeof( *a );
printf( "%zu\n", n );
return 0;
}