掌握三种方法求解字符串逆序
思路
因为传参进去的是数组首元素的地址,所以传参接收的也是首元素的地址。我们要实现字符串的逆序,我们需要将第一个元素与最后一个元素进行交换,再将第二个元素和倒数第二个元素进行交换,依次类推,最后将所有的字符串内容交换完成实现字符串的逆序。
定义一个数组
代码实现
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void reverse(char* arr)
{
int len = strlen(arr);
char * left = arr;
char* right = arr + len - 1;
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s",arr);
return 0;
}
代码如下:
void reserve(char arr[],int left,int right)
{
//满足这个条件才交换和递归
if (left < right)
{
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
reserve(arr, left + 1, right - 1);
}
}
int main()
{
char arr[] = "abcdef";
int left = 0;
int right = strlen(arr) - 1;
reserve(arr,left,right);
printf("%s\n",arr);
return 0;
}
解题思路:
我们看到下面这张图,我们首先要让a和f交换该怎么换,相信大家写过交换函数,这里我们采用交换函数的思维,先定义一个字符变量temp存储a的值,因为数组传参传递的就是首元素的地址,所以我们解引用a直接指向的就是main中a的值(这里需要一点指针基础),然后我们把解引用a的值给temp,然后将f的值给去a的地方,这里f的地址是什么呢?因为数组传参传递的是首元素的地址,首元素地址也就是a的地址,a的地址加1得到b的地址,加上5得到f的地址,在这里我们strlen求解的是字符串的长度6,所以f的地址等于首元素地址加上字符串长度减一。然后这样我们得到的是f的地址,根据交换函数我们得把f的值传给a,于是解引用f传给解引用a交换值把f的值给到a地址上,因为字符串以\0结尾,所以我们不能直接把a的值给到f的地址上,我们先让f的地址为\0,然后我们再次调用这个reserve_string函数对中间的bcde进行逆序,这时传递给函数的是b的地址所以我们只需首元素加+1就可以得到b的地址。前面的博客小编也说过,函数要递归肯定要有一个限制条件,当什么时候不在递归函数呢?在这我们第一次递归函数交换的是b和e,第二次递归函数交换的是c和d,在这里我们可以发现,当传递给递归函数的字符数组大于或者等于两个数的时候我们还可以交换,而一个数则无需交换,所以,我们只需要让传递给递归函数后面大于等于两个数的时候才进行递归,否则就退出递归。
int my_strlen(char* arr)
{
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
void reserve_string(char* arr)
{
int str = my_strlen(arr);
char temp = *arr;
*arr = *(arr + str - 1);
*(arr + str - 1) = '\0';
if(my_strlen(arr+1)>=2)
reserve_string(arr + 1);
*(arr + str - 1) = temp;
}
int main()
{
char arr[] = "abcdef";
reserve_string(arr);
printf("%s",arr);
}
分析:
在这里题目规定不能使用字符串操作函数,所以得自己定义一个函数来求字符串长度。
通过本次学习,学会三种方法实现字符串逆序。
本文案可参考小编之前所写的详解sizeof和strlen和 c语言函数学习,从入门到掌握
如本文案对各位读者有所帮助,双击点赞,后续题目及相关c语言知识小编会持续更新 |