如何打印 table (int) 的所有元素

How to printf all elements of table (int)

我尝试显示 tab 的所有值,但只显示了前 8 个元素

int tab[] = {0,2,5,3,9,0,8,9,2,0,4,3,0};
printf("taille %d: \n", sizeof(tab));

    for (int i=0; i<sizeof(tab); i++)
    {
        printf("indice : %d et valeur :%d \n", i, *(tab + i ));
    }

printf("taille %d: \n", sizeof(tab));

调用未定义的行为,允许任何事情发生,将错误类型的数据传递给printf()%d 期望 int,但 sizeof returns size_t。以十进制打印 size_t 的正确格式说明符是 %zu.

那么,sizeof(tab)就是数组tab的字节大小(严格来说是char的个数)。它不是元素的数量。要获得元素的数量,您必须将其除以一个元素的大小 sizeof(*tab).

int tab[] = {0,2,5,3,9,0,8,9,2,0,4,3,0};
printf("taille %zu: \n", sizeof(tab));

for (int i=0; i<sizeof(tab)/sizeof(*tab); i++)
{
    printf("indice : %d et valeur :%d \n", i, *(tab + i ));
}

sizeof(tab) 生成包含 13 个元素的所有数组 tab 的字节大小,每个元素的大小等于 sizeof( int )(即相同如 sizeof( *tab ))。即

sizeof(tab) 等于 13 * sizeof( int ) 反过来可以等于 52 前提是 sizeof( int ) 等于 4.

但是你只需要输出数组的13个元素。

所以你应该这样写

int tab[] = {0,2,5,3,9,0,8,9,2,0,4,3,0};
const size_t N = sizeof( tab ) / sizeof( *tab );

printf( "taille %zu: \n", N );

for ( size_t i = 0; i < N; i++ )
{
    printf( "indice : %zu et valeur :%d \n", i, *(tab + i ) );
}
putchar( '\n' );

注意输出size_t类型的对象需要使用转换说明符zu.

这是一个演示程序,其中数组输出放在一个单独的函数中。

#include <stdio.h>

FILE * output( const int tab[], size_t n, FILE *fp )
{
    fprintf( fp, "taille %zu: \n", n );

    for ( size_t i = 0; i < n; i++ )
    {
        fprintf( fp, "indice : %zu et valeur :%d \n", i, *(tab + i ) );
    }
    
    return fp;
}

int main(void) 
{
    int tab[] = {0,2,5,3,9,0,8,9,2,0,4,3,0};
    const size_t N = sizeof( tab ) / sizeof( *tab );

    fputc( '\n', output( tab, N, stdout ) );

    return 0;
}

程序输出为

taille 13: 
indice : 0 et valeur :0 
indice : 1 et valeur :2 
indice : 2 et valeur :5 
indice : 3 et valeur :3 
indice : 4 et valeur :9 
indice : 5 et valeur :0 
indice : 6 et valeur :8 
indice : 7 et valeur :9 
indice : 8 et valeur :2 
indice : 9 et valeur :0 
indice : 10 et valeur :4 
indice : 11 et valeur :3 
indice : 12 et valeur :0