重点的话说在前头,注意不是逆序打印
今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种方法来解决
题目具体内容如下:
编写一个函数(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数
但是这里我不会仅仅局限于题目的要求
具体分享思路看我的目录吧!
文章目录
- 非递归方法
-
- 1.循环实现
-
- 1.1循环实现(sizeof)
- 1.2循环实现(strlen)
- 2.函数实现
- 递归方法
-
- 1.递归方法(结果和题目一致,但是不满足题目所给要求,这里只是思路比较简单)
- 3.递归方法(完全满足题目要求,这里需要注重理解了,思路很重要)
- 小结
非递归方法 1.循环实现 1.1循环实现(sizeof)
#include .h>int main()
{
char arr[] = "abcdef";
//[a b c d e f \0]
int sz = sizeof(arr) / sizeof(arr[0]);
//sizeof会算上\0
int left = 0;
int right = sz - 2;
//-2 很关键
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s\n", arr);
return 0;
}
重难点:看代码给right赋值的那一行,为什么用的是sz-2?
原因就是sizeof会计算字符串中的\0,会让计算的数组元素多1,这里需要减1,再加上数组第一位从0开始,再减1,故需要减2
1.2循环实现(strlen)
#include .h>
#include .h>int main()
{
char arr[] = "abcdef";
//[a b c d e f \0]
int left = 0;
int right = strlen(arr) - 1;
//strlen不会算上\0
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s\n", arr);
return 0;
}
重难点:这里和1.1形成鲜明的对比,right只需要求出来的数减1,原因就在strlen不会计算字符串末尾的\0
2.函数实现
#include .h>
#include .h>void reverse(char arr[])//arr[]和*arr是一个意思(都指的首元素地址)
{
int left = 0;
//int sz = sizeof(arr) / sizeof(arr[0]);
//int right = sz - 2;
//这里通过函数调用的方式时,在函数内部使用sizeof不行,会出错。。。。。。详见相关博客
int right = strlen(arr) - 1;
//strlen不会算上\0while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s\n", arr);
return 0;
}
重难点:第一个(是我自己一开始没有理解的),这里的arr[]和*arr是一个意思(都指的首元素地址),也就是说,是一个意思,两种写法而已。
第二个,这里的不能通过函数调用的方式时,在函数内部使用sizeof计算会出错,因为数组传参传进去的只是首元素的地址,故无法准确计算出来。(这里sizeof具体解释我找到了一个写得蛮好的博客,分享给大家)
https://blog.csdn.net/xiaonan153/article/details/81411600
递归方法 1.递归方法(结果和题目一致,但是不满足题目所给要求,这里只是思路比较简单)
#include .h>
#include .h>void reverse(char arr[], int left, int right)
{
if (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
reverse(arr, left + 1, right - 1);
}
}int main()
{
char arr[] = "abcdef";
//[a b c d e f \0]
int left = 0;
int right = strlen(arr) - 1;
reverse(arr,left,right);
printf("%s\n", arr);
return 0;
}
重难点:第一这里使用了库函数strlen
第二这里自定义的函数使用了三个参数
但是!这个思路非常清晰明了
3.递归方法(完全满足题目要求,这里需要注重理解了,思路很重要)
#include .h>int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}void reverse(char* str)
{
int len = my_strlen(str);
char tmp = *str;
//1
*str = *(str + len - 1);
//2
*(str + len - 1) = '\0';
//3
if (my_strlen(str + 1) >= 2)
reverse(str + 1);
//4
*(str + len - 1) = tmp;
//5
}int main()
{
char arr[] = "abcdef";
//[a b c d e f \0]
reverse(arr);
printf("%s\n", arr);
return 0;
}
重难点:第一:这里我们便可以自定义一个和strlen功能类似的函数即可
第二:是本文最难的地方,我放一张图片,大家看看整体思路,一共五步,对应着五步代码
文章图片
小结 【c语言|你能用多少种方法字符串中的字符反向排列,要不看看我的】一道题目,如果每天太多限制条件的话,解决的方法是有很多的,一千个人可以写出一千种形式。所以以上只是一些胡思乱想,欢迎各位在评论区指出我的各种,我很愿意看到自己的错误。也很感谢各位的观看,既然看到这里,不妨给个四连吧!
推荐阅读
- c语言|学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码
- c语言|n子棋,你能下赢电脑吗,来玩玩吧
- c语言|c语言初学者对scanf函数难分辨理解的两个点(欢迎补充)
- c语言药店管理系统|药店管理系统(c语言链表实现)
- java|Java学习资料分享
- 51单片机笔记|(十四)51单片机——LCD1602实现滚动效果
- 单片机|单片机 c语言 d,单片机89C51与A/D转换器MAX - 控制/MCU - 电子发烧友网
- 单片机从入门到高级|51单片机——AD/DA转换
- 算法|C语言RGB转Lab色域