首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用“`memmove`”循环移动数组

用“`memmove`”循环移动数组
EN

Stack Overflow用户
提问于 2017-03-27 20:31:09
回答 1查看 4.2K关注 0票数 4

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

代码语言:javascript
复制
#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

代码语言:javascript
复制
for (shift = MAX - 1; shift >= 0; --shift) {
    if (foo[shift]) break;
}

但我现在不知道如何使用memmove()来执行转换,我试图执行memmove(bar + shift, foo, MAX * sizeof(*foo)-1);,但没有成功。

memmove()是工作的正确工具吗?如何循环所描述的整数数组?如果这种情况发生在bar作为指针传递的函数中怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-27 20:44:33

  • 用于计算shift的公式没有给出要移动的职位数。
  • 您没有移动正确的字节数(MAX * sizeof(*foo)-1绝不是基于尾随零的数量)。
代码语言:javascript
复制
#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));

您可以就地执行,因为您知道要“旋转”哪些值。

代码语言:javascript
复制
memmove(foo+shift, foo, (MAX-shift) * sizeof(*foo));
memset(foo, 0, shift * sizeof(*foo));

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43055913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档