关于字符串旋转:我们都知道在C语言中字符串是存在一串连续的空间中的。要想对字符串进行修改,
我们通常都是选择把字符串存在数组里,利用数组下标的控制来修改指定位置字符串的。
好了,思路大概就是这样让我们一起来看到题:
1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
根据我们刚才的思路呢,要想完成这道题我们就需要创建两个数组,arr保存要使用的字符串,arr1为空作为临时存储数据。然后将要旋转到前面的字串从arr1中取出来更改到arr的前面,再将要旋转到后面的字串提出来,更改到arr的后半部分。详情看代码注释
void Slue(char arr[], int a,const int length)
{
//创建一个足够大的临时使用数组
char arr1[100] = { 0 };
int k = 0;
int i = 0;
//先将原数组的值保存在另一个足够大的空白数组
for (k = 0; k < length; k++)
{
arr1[k] = *(arr + k);
}
//再将要被旋转到前面的数保存到arr的前面
for (k = a; k < length; k++)
{
*(arr + i) = arr1[k];
i++;
}
//将要被旋转到后面的数字保存到arr后面
for (k = 0; k < a; k++)
{
*(arr + i) = arr1[k];
i++;
}
}
int main()
{
char arr[] = "ABCD";
int a = 0;
scanf("%d", &a);
Slue(arr, a,strlen(arr));
printf("%s", arr);
system("pause");
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1 = abcd和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAAB
int is_slue(char *arr1, char *arr2, int length)
{
int i = 0;
int count = 0;
int ret = 0;
for (i = 0; i < length; i++)
{
//遍历对比两,记录相同字符的个数
//以此可以得出旋转了多少位
while(*(arr1 + i) == *arr2)
{
count++;
//数组名进行运算会隐式转换成指针,此时arr2一直往后走
arr2++;
}
}
//length-count即为左旋的一部分字符个数
//count为参与旋转的另一部分字符个数
//
for (i = 0; i < length-count; i++)
{
//上一个for循环,将指针arr2已经走到后半部分
if (*(arr1 + i) == *arr2)
ret++;
else
return 0;
}
//判断
if (length == count+ret)
return 1;
return 0;
}
int main()
{
char arr1[] = "dabc";
char arr2[] = "abcd";
int ret = 0;
//接受返回值
ret = is_slue(arr1, arr2,strlen(arr1));
//对返回值进行判断
if (ret == 1)
printf("两字符串互为左旋字符串\n");
else
printf("error\n");
return 0;
}