将第一个数组索引放在数组末尾

时间:2019-09-03 12:32:40

标签: c

我有一个名为int arr [10] = {1,2,3,4,5}

的数组

据我了解,数组的其余部分填充有0。

我的问题是,如果数组长度固定,如何将第一个索引放在最后一个非0的索引后面。例如

我相信0不会在实际的printf中显示,但出于说明目的我将其包括在内

for (int i = 0 ; i < 10 ; i++)
{
    print("%i" , arr[i]);
}

输出

1 2 3 4 5 0 0 0 0 0

如果我这样将第一个索引移到5个索引的后面

for (int i = -1 ; i < 10 ; i++)
{
    arr[i] = arr[i + 1];
    print("%i" , arr[i]);
}

输出将1放在5后面还是整个数组的后面?

2 3 4 5 1 0 0 0 0 0

或者因为那时有0

2 3 4 5 0 0 0 0 0 1

如果我的问题不清楚,请告诉我,我会尽力解释。

2 个答案:

答案 0 :(得分:4)

  

输出

1 2 3 4 5 0 0 0 0 0

不,实际输出是

1234500000

您的代码具有未定义的行为。循环的第一次迭代(使用i = -1)尝试分配给arr[-1],该迭代不存在:

    arr[i] = arr[i + 1];

类似地,最后一次迭代(使用i = 9)尝试从arr[10]中读取,该迭代也不存在。

我不确定您为什么认为您的代码会将第一个元素移回。

答案 1 :(得分:0)

  

据我了解,数组的其余部分填充有0's

您是对的。:)

  

如果我这样将第一个索引移到5个索引的后面

for (int i = -1 ; i < 10 ; i++)
{
    arr[i] = arr[i + 1];
    print("%i" , arr[i]);
}

然后,您将得到未定义的行为,因为索引-110无效。

您似乎想做的是以下

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { N = 10 };
    int a[N] = { 1, 2, 3, 4, 5 };

    size_t pos = 0;

    while ( pos < N && a[pos] != 0 ) ++pos;

    if ( pos != N && !( pos < 3 ) )
    {
        int tmp = a[0];
        pos -= 2;

        memmove( a, a + 1, pos * sizeof( int ) );

        a[pos] = tmp;
    }

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    return 0;
}

程序输出为

2 3 4 1 5 0 0 0 0 0