- 字符串逆序
- 迭代方法
- 递归方法(少参数 )
- (有strlen)
- (无strlen)
- 递归方法二(多参数)
迭代方法题目:字符串逆序
编写一个函数reverse(char *string)
实现:将参数字符串中的字符反向排列,不是逆序打印
要实现一个字符串逆序,如下图所示,令这个字符串为abcdefg,它逆序就是把它实现为gfedcba。所以就是a和g交换位置,b和f交换位置,c和e交换位置。可以理解为左边和右边的元素一个一个交换位置。写一个交换函数reverse,交换字符是一个循环的过程,写一个while循环实现。这里要注意,如果是用sizeof求字符个数的话,字符串的结束标志是 ,所以right应等于sz-2,还要注意如果要用sizeof的话这里的sizeof(arr)/sizeof(arr[0])大小不能在函数内部求。
代码如下:
#includevoid reverse(char* str) { int left = 0; int sz = strlen(str); int right = sz - 1; while (left < right) { char tmp = str[left]; str[left] = str[right]; str[right] = tmp; right--; left++; } } int main() { char ch[] = "abcdefg"; reverse(ch); printf("%sn", ch); return 0; }
递归方法(少参数 ) (有strlen)实现效果:
我们用递归的方法怎么实现字符串逆序?还是实现abcdefg逆序为gfedcba的过程,字符串的结束标志是 ,要想逆序整个字符串,可以理解为交换a和g加上逆序字符串bcdef,然后交换b和f加上逆序字符串cde。可以先将 放在原先g的位置,这样可以实现字符串bcdef逆序,那b和f交换先把b放在tmp中,再把原来f的位置换成 ,可以实现字符串cde的逆序。如下图所示:总共把整个过程分成五步。第一步把a放在tmp中,第二步把g放在a原来的位置,第三步把 放到g的位置,第四步实现字符串bcdef的逆序,第五步把tmp的元素放到原来g的位置。
代码如下:
#includevoid reverse(char* str) { char tmp = *str;//1 int len = strlen(str); *str = *(str + len - 1);//2 *(str + len - 1) = ' ';//3 if (strlen(str+1)>=2) reverse(str + 1);//4 *(str + len - 1) = tmp;//5 } int main() { char ch[] = "abcdefg"; reverse(ch); printf("%sn", ch); return 0; }
代码实现效果:
(无strlen)那要求我们不能使用C函数库中的字符串操作函数的话,那strlen就不能使用了,那我们可以自己写一个实现求字符串长度的函数。
代码如下:
int my_strlen(char* str)
{
int count = 0;
while (*str != ' ')
{
count++;
str++;
}
return count;
}
递归方法二(多参数)
多参数的实现方法和迭代的方法相似,a和g交换后,再让字符串bcdef逆序,b和f交换后,再让字符串cde逆序。
代码如下:
#includeint my_strlen(char* str) { int count = 0; while (*str != ' ') { count++; str++; } return count; } void reverse(char ch[],int left,int right) { char tmp = ch[left]; ch[left] = ch[right]; ch[right] = tmp; if (left < right) reverse(ch, left + 1, right - 1); } int main() { char ch[] = "abcdefg"; int left = 0; int right = strlen(ch) - 1; reverse(ch,left,right); my_strlen(ch); printf("%sn", ch); return 0; }
代码实现效果:
写在最后✨:码字不易,对你有帮助的话,给个三连支持一下叭,或者也可以关注一下,每周更一篇,感谢支持!



