假设我有一个这样的整数数组

#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()是作为指针传递的,该怎么办?

最佳答案

你用来计算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));

您可以在适当的位置执行此操作,因为您知道要“旋转”的值。
memmove(foo+shift, foo, (MAX-shift) * sizeof(*foo));
memset(foo, 0, shift * sizeof(*foo));

必须使用memmove而不是memcpy,因为目标缓冲区和源缓冲区可能重叠。

关于c - 用`memmove'循环移位数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43055913/

10-09 13:11