关于字符串旋转:我们都知道在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;
}
博客围绕C语言中字符串旋转展开。介绍了实现左旋字符串中k个字符的方法,需创建两个数组,通过数组下标控制修改字符串。还讲解了判断一个字符串是否为另一个字符串旋转后的字符串的思路,并给出示例说明。
1074

被折叠的 条评论
为什么被折叠?



