我创建了两个需要在第二个数组(在本例中为y)旋转后连接的数组。但是我想只旋转这个数组的最后4个字节。这是我的代码:
char x[]={"hello"};
char y[]={"goodmorning"};
char combine[20];
strcpy(combine, x);
strcat(combine, y);
printf(combine);
这里在连接成联合之前我想做旋转操作。
旋转前
combine= hellogoodmorning
旋转后
combine= gninhellogoodmor
我试图寻找一个逻辑来在线完成,但找不到具体的东西。任何人都可以帮忙。
答案 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