为什么这段 C 代码没有为我计算数组中元素的数量?

问题描述 投票:0回答:3

无法计算数组中元素的数量

#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 作为输出吗?

arrays c for-loop sizeof function-definition
3个回答
5
投票

您的数组末尾需要有一个 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;
}

https://godbolt.org/z/TWGseeP8s


1
投票

您尝试检查

\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;
}

1
投票

你声明了一个

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.