如何旋转数组的最后4个字节?

时间:2015-07-09 08:59:59

标签: c arrays

我创建了两个需要在第二个数组(在本例中为y)旋转后连接的数组。但是我想只旋转这个数组的最后4个字节。这是我的代码:

 char x[]={"hello"};
 char y[]={"goodmorning"};
 char combine[20];

 strcpy(combine, x);
 strcat(combine, y);

 printf(combine);

这里在连接成联合之前我想做旋转操作。

旋转前

combine= hellogoodmorning
旋转后

combine= gninhellogoodmor

我试图寻找一个逻辑来在线完成,但找不到具体的东西。任何人都可以帮忙。

4 个答案:

答案 0 :(得分:1)

我用

#define swap(a, b) { a ^= b; b ^= a; a ^= b; }

void reverse(char * s, int beg, int end) {
    while (beg < end) {
        swap(s[beg], s[end]);
        ++beg, --end;
    }
}

void rotate(char * s, int k) {
    if (!s || !*s) return;
    int len = strlen(s);
    k %= len;
    reverse(s, 0, len - 1);
    reverse(s, 0, k - 1);
    reverse(s, k, len - 1);
}

并调用rotate(combine, 4);在组合中旋转4个字节。

答案 1 :(得分:1)

void strRev(char *s)
{
    char temp, *end = s + strlen(s) - 1;
    while( end > s)
    {
        temp = *s;
        *s = *end;
        *end = temp;
        --end;
        ++s;
    }
}
 char x[]={"hello"};
 char y[]={"goodmorning"};
 char combine[20];

 strcpy(combine, x);
 strcat(combine, y);

 strRev(combine);
 strRev(combine+4);

 printf(combine);

答案 2 :(得分:1)

尝试如下所示的内容。我使用strncpy代替strcpy()strcat()。尝试调试以获得更好的理解。运行Live

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROTATION_LEN 4

int main() {
    char x[] = { "hello" };
    char y[] = { "goodmorning" };

    char c;
    char combine[20] = {0}; // init with null

    char * com = combine;
    int i;
    int leny = strlen(y);
    int lenx = strlen(x);
    for (i = 0; i < ROTATION_LEN; ++i) {
        c = y[leny -1 - i];
        combine[i] = c;
    }
    com += ROTATION_LEN; // forward address of combine by ROTATION_LEN
    strncpy(com, x, lenx);
    com += lenx; // forward address of combine by x length
    strncpy(com, y, leny - ROTATION_LEN);

    printf(combine);

    return 0;
}

输出:

  

gninhellogoodmor

答案 3 :(得分:0)

如果您定义这样的函数:

void rotate_last_four(char *string)
{
    char old_four[4];
    char new_four[4];

    strncpy(old_four, string + strlen(string) - 4, 4);

    new_four[0] = old_four[3];
    new_four[1] = old_four[2];
    new_four[2] = old_four[1];
    new_four[3] = old_four[0];

    memmove(string + 4, string, strlen(string) - 4);
    strncpy(string, new_four, 4);
}

然后,您只需在打印combine之前将此行添加到代码中:

rotate_last_four(combine);

输出为:gninhellogoodmor