在C中移动char数组

时间:2016-02-23 16:58:18

标签: c arrays string

例如,如果我在char数组中有一个字符串,如" abcdef",那么我想打印一个新的字符串" bcdefa"接下来就是" cdefab"依此类推,直到它循环通过字符串结束于" fabcde"

对不起,我是C的新手,并不是最好的数组操作,也不确定什么是最简单的方法。

我在考虑可能首先重新排列索引?但我不确定如何循环。或者我可以使用string.h库中的某些函数以更有效的方式处理它吗?

2 个答案:

答案 0 :(得分:2)

这称为阵列旋转,这是一个很好的技巧。你反转两个部分,然后你扭转整个事情。这是一个例子:

#include  <stdio.h>
#include <string.h>

void swap(char* a, char* b) {
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

void rev(char* array, size_t n) {
    for (size_t i = 0; i < n / 2; i++)
        swap(array + i, array +(n - i - 1));
}

void rotate_one(char* str) {
    rev(str + 1, strlen(str) - 1);
    rev(str, strlen(str));
}

参见 Demo

答案 1 :(得分:1)

这是字符串:

char str[] = "abcdef";

保存第一个字符,因为稍后会覆盖它:

char tmp = str[0];

然后将字符串的其余部分向前移动一个字符。请注意,此处不允许strcpy(),因为在重叠的字符串上,行为是未完成的。

memmove(str, &(str[1]), strlen(&(str[1])));

然后将保存的第一个字符存储在最后:

str[strlen(str) - 1] = tmp;

完成一次轮换。和

printf("%s\n", str);

将显示bcdefa