方法一:
#include<stdio.h>
#include<string.h>
//abcdefg a=2--->cdefgab
void fun(char arr[], int x,int lon)//字符串左旋
{
int n = 0;
for (n = 0; n < x; n++)
{
char tmp = arr[0];//储存数组第一位的值
int b = 0;
for (b = 0; b < lon - 1; b++)
{
arr[b] = arr[b + 1];
}
arr[lon-1] = tmp;//将数组第一位的值赋给最后一位
}
}
int main()
{
char arr[] = "abcdefg";//需要逆序的字符串
int a = 0;
scanf("%d", &a);//逆序几个字符
int lon = strlen(arr);
a %= lon;//如果输入的值大于数组的长度,使其取模数组的长度,列如:输入a=12,a%=lon --》
a=12%7--》5,实际逆序的就是5个字符
fun(arr, a, lon);
printf("%s", arr);
return 0;
}
方法二:
#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse(char* left, char* right)
{
//逆序left和right指针区间内的字符
assert(left && right);//断言
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void fun(char arr[], int x)
{
int lon = strlen(arr);
x %= lon; //列:x=2
reverse(arr, arr + x - 1); // 'ba' cdefg
reverse(arr+x, arr + lon - 1);// ba 'gfedc'
reverse(arr, arr + lon - 1); // cdefgab
}
int main()
{
char arr[] = "abcdefg";//需要逆序的字符串
int a = 0;
scanf("%d", &a);//逆序几个字符
fun(arr, a);
printf("%s", arr);
return 0;
}
方法三:
#define SZ 8//需要逆序字符的长度或大小(考虑到‘\0’)
int main()
{
char arr1[SZ] = "abcdefg";
char arr2[SZ] = "";//和arr1同样大小的数组(需要初始化)
int a;
scanf("%d", &a);//输入要逆序几个字符
a %= SZ;//原理同上
int b = 0;
for (b = 0; b < a; b++)
{
arr2[b] = arr1[b];//用arr1中的前a个字符初始化arr2
}
strcpy(arr1, arr1+a);
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}