使用 memmove 循环移动数组
Circular shifting an array with `memmove`
假设我有一个像这样的整数数组
#define MAX 5
int bar [MAX] = {0};
int foo [MAX] = {3,1,0,0,0};
现在我想移动这个数组,使所有空条目都在左边,即 bar = {0,0,0,3,1}
。
我想我可以通过
- 查找我必须执行的班次数
- 使用
memmove()
进行转换。
我用下面的循环解决了 1.
for (shift = MAX - 1; shift >= 0; --shift) {
if (foo[shift]) break;
}
但我现在不知道如何使用memmove()
来执行转换,我尝试memmove(bar + shift, foo, MAX * sizeof(*foo)-1);
但没有成功。
memmove()
是完成这项工作的正确工具吗?如何按照所述循环整数数组?如果这发生在 bar
作为指针传递的函数内部怎么办?
您用来计算shift
的公式没有给出要移动的位置数。
您没有移动正确数量的字节(MAX * sizeof(*foo)-1
绝不是基于尾随零的数量)。
#include <string.h>
#define MAX 5
int bar[MAX] = {0};
int foo[MAX] = {3,1,0,0,0};
int i;
int shift = 0;
for (i=MAX; i--; ) {
if (foo[i]) {
shift = MAX - (i + 1);
break;
}
}
memcpy(bar+shift, foo, (MAX-shift) * sizeof(*foo));
memcpy(bar, foo+(MAX-shift), shift * sizeof(*foo));
您可以就地完成,因为您知道 "rotate in" 的值。
memmove(foo+shift, foo, (MAX-shift) * sizeof(*foo));
memset(foo, 0, shift * sizeof(*foo));
必须使用 memmove
而不是 memcpy
,因为目标缓冲区和源缓冲区可能重叠。
假设我有一个像这样的整数数组
#define MAX 5
int bar [MAX] = {0};
int foo [MAX] = {3,1,0,0,0};
现在我想移动这个数组,使所有空条目都在左边,即 bar = {0,0,0,3,1}
。
我想我可以通过
- 查找我必须执行的班次数
- 使用
memmove()
进行转换。
我用下面的循环解决了 1.
for (shift = MAX - 1; shift >= 0; --shift) {
if (foo[shift]) break;
}
但我现在不知道如何使用memmove()
来执行转换,我尝试memmove(bar + shift, foo, MAX * sizeof(*foo)-1);
但没有成功。
memmove()
是完成这项工作的正确工具吗?如何按照所述循环整数数组?如果这发生在 bar
作为指针传递的函数内部怎么办?
您用来计算
shift
的公式没有给出要移动的位置数。您没有移动正确数量的字节(
MAX * sizeof(*foo)-1
绝不是基于尾随零的数量)。
#include <string.h>
#define MAX 5
int bar[MAX] = {0};
int foo[MAX] = {3,1,0,0,0};
int i;
int shift = 0;
for (i=MAX; i--; ) {
if (foo[i]) {
shift = MAX - (i + 1);
break;
}
}
memcpy(bar+shift, foo, (MAX-shift) * sizeof(*foo));
memcpy(bar, foo+(MAX-shift), shift * sizeof(*foo));
您可以就地完成,因为您知道 "rotate in" 的值。
memmove(foo+shift, foo, (MAX-shift) * sizeof(*foo));
memset(foo, 0, shift * sizeof(*foo));
必须使用 memmove
而不是 memcpy
,因为目标缓冲区和源缓冲区可能重叠。