我有一个名为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
如果我的问题不清楚,请告诉我,我会尽力解释。
答案 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]);
}
然后,您将得到未定义的行为,因为索引-1
和10
无效。
您似乎想做的是以下
#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