【问题标题】:How to shift array elements 2 times to the right by two values in C?如何在C中将数组元素向右移动两个值?
【发布时间】:2020-05-16 19:24:01
【问题描述】:

我有一个数组[1, 2, 3, 4, 5, 6, 7, 8],我需要得到[__, __, 1, 2, 3, 4, 5, 6],我可以在其中将我的新元素放在空白处。我尝试以标准方式进行:

int temp1 = arr[len - 1];
int temp2 = arr[len - 2];

for (int i = len - 1; i > 1; i -= 2) {
    arr[i] = arr[i - 1];
    arr[i - 1] = arr[i - 2];
}

arr[0] = temp1;
arr[1] = temp2;

但它似乎什么也没做。

【问题讨论】:

    标签: c logic


    【解决方案1】:

    您只是将元素移动了一个空格,而不是两个。看看以下内容:

    #include <stdio.h>
    
    int main()
      {
      int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
      int len = sizeof(arr) / sizeof(int);
    
      printf("len = %d\n", len);
    
      int temp1 = arr[len - 1];
      int temp2 = arr[len - 2];
    
      printf("temp1 = %d\n", temp1);
      printf("temp2 = %d\n", temp2);
    
      for(int i = len-1 ; i > 1 ; --i)
        {
        printf("Moving arr[%d] to arr[%d]\n", i-2, i);
        arr[i] = arr[i-2];
        }
    
      arr[0] = temp1;
      arr[1] = temp2;
    
      for(int i = 0 ; i < len ; ++i)
        printf("arr[%d] = %d\n", i, arr[i]);
      }
    

    onlinegdb here

    编辑

    如果您宁愿取消循环并一次性复制内存,您可以使用:

    #include <stdio.h>
    #include <string.h>
    
    int main()
      {
      int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
      int len = sizeof(arr) / sizeof(int);
    
      printf("len = %d\n", len);
    
      int temp1 = arr[len - 1];
      int temp2 = arr[len - 2];
    
      printf("temp1 = %d\n", temp1);
      printf("temp2 = %d\n", temp2);
    
      memmove(((int *)arr)+2, arr, (len-2)*sizeof(int));
    
      arr[0] = temp1;
      arr[1] = temp2;
    
      for(int i = 0 ; i < len ; ++i)
        printf("arr[%d] = %d\n", i, arr[i]);
      }
    

    请注意,我使用了memmove 而不是memcpy,因为源缓冲区和目标缓冲区重叠。 memmove 可以正确处理此问题,而 memcpy 不需要这样做。

    onlinegdb here

    【讨论】:

    • 这确实是我想要的,谢谢。
    • 第二个例子 [0, 1, 2, 3, 4, 5] 输出 [ _ _ 0, 3, 4, 5] 似乎有错误。
    • @tomashauser:我没有得到这个结果。当我run it at onlinegdb 输入{0, 1, 2, 3, 4, 5} 时,它输出5, 4, 0, 1, 2, 3。您是否将memmove 替换为memcpy?如果memcpy 产生不正确的结果,我不会感到惊讶,因为memcpy 可能无法正确处理重叠移动。您使用的是什么编译器和运行时?
    【解决方案2】:

    我想代码是这样重写的

    
    int arr[8] = { 1,2,3,4,5,6,7,8 };
    
    for( int i = 0 ; i < 8 ; i++ ){
        arr[7-i] = arr[7-i-1];
    }
    for( int i = 0 ; i < 8 ; i++ ){
        arr[7-i] = arr[7-i-1];
    }
    
    
    //here, arr[8] = { 1,1,1,2,3,4,5,6 }
    //so, you can put new two elements in arr[0], arr[1]
    
    

    【讨论】:

      【解决方案3】:

      以下内容可能对您有用,

          #include <stdio.h>
          #include <memory>
      
          int main()
          {
            int temp1[8] = {1, 2, 3, 4, 5, 6, 7, 8};
            int temp2[10] = { 0 }; // to avoid garbage values in 0 & 1 positions or you may find a place holder to indicate empty
      
            memcpy(&temp2[2], temp1, sizeof(temp1));
      
            for (int i = 0; i < 10; ++i)
             printf("%d ", temp2[i]);
      
          }
      

      【讨论】:

      • 问题被标记为 C,而不是 C++。
      • 我将 C++ 用于输出,这就是你们投反对票的原因。
      • @tomashauser 我使用了纯 C 的概念(memcpy)
      • memcpy 不能(或至少不是必需)正确处理重叠的移动。
      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2019-12-26
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多