字符串倒序输出 递归和正常写法

字符串倒序输出,我们第一个想到的就是位置互换,将字符串的第一个位置,与字符串的最后一个位置互换,然后字符串的第二个位置,与倒数第二个位置互换,以此类推,到了中间,左边的位置大于右边的时候,那么这个循环就终止了

循环条件(left < right);

循环语句(在这里也用到了swap)

tmp = string[left];

string[left] = string[right];

string[right] = tmp;

left++;

right++;

不用strlen这个库函数的时候,需要用到自己创建的函数,可以用上字符串的判断条件,末尾是'\0'

用上while循环,*string != '\0' string是一个指针,*string就是第一个数

在while循环里面,string++,随着地址一步一步的慢慢增多,这个字符串上面的所有字符也一个一个的被略过,用count这个变量来输出这个过程。

代码

#include <stdio.h>
int my_strlen(char* string)
{
    int count = 0;
    while (*string != '\0')
    {
        count++;
        string++;
    }
    return count;
}

void reverse_string(char *string)
{
    int left = 0;
    int right = my_stlen(string) - 1;//字符串下标从0开始
    while(left < right)//这个表达式对了,才能进入循环
    {
        char tmp = string[left];
        string[left] = string[right];
        string[right] = string[left];
        left++;
        right--;
    }
}

int main()
{
    char arr1[] = "abcdef";
    printf("%s", arr1);
    reverse_string(arr1);//arr1是一个地址,所以在reverse_string这个函数形参要用到char * 类型的形参
    printf("%s", arr1);
    return 0;
}

下面我们使用递归方法

因为交换每次只能最前面一个和最后面一个交换,也只有这两个可以通过0和strlen()- 1轻松获取,中间的这一大坨东西是一直留在那个里面的。

那么我们也可以写出这个迭代函数,就是把第一个和最后一个交换了,用迭代函数处理中间那一串字符串,每次迭代函数都是对那一串字符串进行取值

第一步:先把第一个位置上面的值给取下来,放到临时变量里面,tmp = string[0]

第二部:把最后一个数放在第一个的位置上,string[my_strlen - 1] = string[0]

第三步:(关键的一步),不是把临时变量放到最后一个的空位里面,而是为那中间的那一串字符串设立一个'\0' 字符串的结束标志

最后我们再把 那个临时变量放到那个地方上去

迭代还需要一个判断条件,就是中间的那一串东西没有字符了然后就输出

void reverse_string(char * str)
{
    char tmp = str[0];
    str[0] = str[strlen(str) - 1);//
    str[strlen(str) - 1] = '\0';
    if (strlen(str + 1) >= 2)
    {
        reverse_string(str + 1);
    }
    str[strlen(str) - 1 = tmp;
}

//也可以这样写
void reverse_string(char* str)
{
    char tmp = *str;
    int len = my_strlen(str);
    *str = *(str + len - 1);
    *(str + len - 1) = '\0';
    if (my_strlen(str + 1) >= 2)
    {
        reverse_string(str + 1);
    }
    
    *(str + len - 1) = tmp;
}//就是用上了*这个符号

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值