void reverse(char* left, char* right) {//逆序函数
assert(left);
assert(right);
while (left < right) {
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left(char* a, int k) {
assert(a != NULL);
int len = strlen(a);
reverse(a, a + k - 1);//逆序左部分
reverse(a + k, a + len - 1);//逆序右部分
reverse(a, a + len - 1);//逆序整体
}
int main() {
char a[100];
int k = 0;
printf("输入字符串:");
gets(a);
printf("输入左翻转的个数:");
scanf("%d", &k);
left(a, k);
printf("%s", a);
return 0;
}
举个例子,对于"abcdef"这样的字符串,选取两个个字符翻转则变成"dcefab"
我们当然可以将a和b抽出来,然后把bcdef前移一格,再把a插入到最后面,再前移一格,把b插入到后面。
但是这样的方法很麻烦,效率也不高。
通过逆序的方法,我们可以三步实现这个效果。
第一步对ab逆序,则变成了ba
第二步对cdef逆序,则变成fedc
第三步整体逆序,则变成dcefab
代码则如图所示。