C 将数组中的元素向右移动1

C 将数组中的元素向右移动1,c,C,我不知道如何正确地将数组中的元素向右移动1。该数组被初始化为[1,2,3,4,5]。所以当我移位时,结果应该是[2,3,4,5,1],但结果是[2,3,4,5,0],我不知道为什么。这是我到目前为止所拥有的- for(k = 0; k <= n - 1; k++){ array[k] = array[k+1]; } printf("Array is now:\n"); k = 0; while(k < n) { printf("x[

我不知道如何正确地将数组中的元素向右移动1。该数组被初始化为[1,2,3,4,5]。所以当我移位时,结果应该是[2,3,4,5,1],但结果是[2,3,4,5,0],我不知道为什么。这是我到目前为止所拥有的-

   for(k = 0; k <= n - 1; k++){
   array[k] = array[k+1];
   }

   printf("Array is now:\n");
   k = 0;
   while(k < n) {
       printf("x[%d] = %f\n", k, array[k]);
       k++;
   }

结果垂直打印

这是仅按1右移的基本代码。如果您想要一个通用代码,可以使用任何向右移位的索引,我建议使用一个变量

//array elements are from index 0 to n-1

int tempData  = array[0]; // if right shift is only by 1
for(k = 0; k < n-1; k++){
   array[k] = array[k+1];
}

array[n-1] = tempData; //reinstall the value of first index to last index
printf("Array is now:\n");
k = 0;
while(k < n) {
    printf("x[%i] = %d\n", k, array[k]);
    k++;
}

我知道这是一个老问题,但我认为为将数组元素向右移动1的任务提供完整的代码是有用的。 一个想法是从末尾开始,用它的左邻居替换每个元素。因为首先,我们覆盖结束元素,我们将保存它并将它放在循环后第一个插槽的最终位置

代码:


不保存第一个元素的副本。当k为n-1时,你读出数组的边界,因为k+1==n-1+1==n,所以数组[n]总共是。我建议你编写适当的函数,将数组解释为移位的。实际上,对于大型阵列,移位元件的成本很高。如果保证它们相对较小,则可以随意使用任何有效的参数。编译器警告C4477:“printf”:格式字符串“%f”需要类型为“double”的参数,但变量参数2的类型为“int”。我假设数组为int,请提供MCVE。@如果您试图编写将元素向左而不是向右移动的代码,则显示的操作通常被描述为“向右旋转”。这仍然从越界数组读取,这可能会导致错误。我建议k数组[k]=tempData;基于优化选项可以不同。。。。顺便说一句,如果你已经有一个现成的索引,你不需要另一个减法。。。
#include <stdio.h>

void rotate_right(int* a, const int n) {
    if (n < 1) return;
    const int temp = a[n - 1];
    for (int i = n - 1; i > 0; i--) {
        a[i] = a[i - 1];
    }
    a[0] = temp;
}

int main() {
    int a[] = { 1 , 2, 3, 4, 5 };
    const int n = sizeof(a) / sizeof(a[0]);

    rotate_right(a, n);

    for (int i = 0; i < n; ++i) {
        printf("%d ", a[i]);
    }
}