gpt4 book ai didi

使用 `memmove` 循环移动数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:51:00 29 4
gpt4 key购买 nike

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

#define MAX 5
int bar [MAX] = {0};
int foo [MAX] = {3,1,0,0,0};

现在我想移动这个数组,使所有空条目都在左边,即 bar = {0,0,0,3,1}

我以为我可以做到这一点

  1. 找出我必须执行的类次数
  2. 使用 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));

您可以就地执行此操作,因为您知道要“轮换”哪些值。

memmove(foo+shift, foo, (MAX-shift) * sizeof(*foo));
memset(foo, 0, shift * sizeof(*foo));

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com