有c语言怎么做到字符串左旋
时间: 2024-06-13 20:05:58 浏览: 93
在C语言中,可以通过暴力移位法或者Left函数实现字符串左旋。其中,暴力移位法是通过循环移位的方式实现字符串左旋,而Left函数则是通过将字符串分为两部分,分别进行翻转,再将整个字符串翻转的方式实现字符串左旋。
以下是两种实现字符串左旋的方法:
1. 暴力移位法
```c
#include <stdio.h>
#include <string.h>
void left_move(char* str, int k) {
int len = strlen(str);
int i = 0;
k %= len; // 省去多余循环步骤,多出字符串长度会导致多余的循环操作
while (k--) { // 左旋循环k次
char tmp = str[0]; // 创建tmp来存放字符串第一个字符
for (i = 0; i < len - 1; i++) {
str[i] = str[i + 1]; // 后面的字符依次向前一位
}
str[i] = tmp; // 在末尾放入tmp中的字符
}
}
int main() {
char str[] = "ABCD";
left_move(str, 2);
printf("%s\n", str); // 输出:CDAB
return 0;
}
```
2. Left函数实现
```c
#include <stdio.h>
#include <string.h>
#include <assert.h>
void Reverse(char *str, int start, int end) { // 翻转字符串
assert(str);
while (start < end) {
char tmp = str[start];
str[start] = str[end];
str[end] = tmp;
start++;
end--;
}
}
void Left(char *str, int len, int n) {
assert(str); // 断言str不为空
assert(len); // 断言字符串长度不为0
assert(n); // 断言输入左旋次数不为0
n %= len; // 省去多余循环步骤,多出字符串长度会导致多余的循环操作
Reverse(str, 0, n - 1); // 翻转前半部分
Reverse(str, n, len - 1); // 翻转后半部分
Reverse(str, 0, len - 1); // 整个字符串翻转
}
int main() {
char str[] = "ABCD";
Left(str, strlen(str), 2);
printf("%s\n", str); // 输出:CDAB
return 0;
}
```
阅读全文