(C语言)字符串反转函数(指针,递归解法)

#include 
//分配空间头函数
#include 
//反转辅助函数(递归)
void reverse_helper(char *start,char *end){
    //递归终止条件
    if(start>=end){
        return;
    }
    //交换头和尾指针的内容
    char temp=*start;
    *start=*end;
    *end=temp;
    //递归调用
    reverse_helper(start+1,end-1);
}
//封装反转函数
void reverse_string(char *str){
    //空字符串返回,不反转
    if(str==NULL){
        return;
    }
    //定义长度
    int len=0;
    //判断长度
    while (str[len]!='\0')
    {
        len++;
    }
    //字符串长度小于等于1不反转
    if(len<=1){
        return;
    }
    //调用反转辅助函数
    reverse_helper(str,str+len-1);
}
int main(){
    //定义指针字符串
    char *str=NULL;
    //动态分配字符串空间
    str=(char*)malloc(100*sizeof(char));
    //判断是否分配成功
    if(str==NULL){
        printf("空间分配失败\n");
        return 1;
    }
    printf("请输入字符串:\n");
    char ch;
    int i=0;
    //获取输入字符串
    while ((ch=getchar())!='\n' && ch!=EOF)
    {
        //判断是否越界
        if(i>=99){
            printf("长度过高,已截断\n");
            break;
        }
        //填入字符串
        str[i++]=ch;
    }
    //字符串末尾加识别符
    str[i]='\0';
    //定义新的字符串
    char *new_str=NULL;
    //重新分配空间
    new_str=(char*)realloc(str,(i+1)*sizeof(char));
    if(new_str==NULL){
        printf("空间分配失败\n");
        free(str);
        return 1;
    }
    //赋值新字符串
    new_str=str;
    reverse_string(new_str);
    printf("翻转之后是:%s\n",new_str);
    free(new_str);
    return 0;
}

下面来解释一下代码:

首先,反转辅助函数是递归函数,终止条件是头大于等于尾,思路是:

如果想反转两个字符,首先要用temp容器,在一个,反转就是镜像反转,怎么才能让头和尾交换呢,我们可以想到数据结构表中的知识,定义一个头指针start,尾指针end,这样让它俩交换就行了

那么怎么交换呢,首先得让指针移动,也就是start+1,end-1,这样头就向后移动,尾就向前移动,这样递归函数就完成了

下面的思路是:

知道了要用头和尾指针,那要是不知道字符串长度怎么才能找到尾呢,因此我们要想办法判断字符串长度,传入字符串指针地址,然后判断字符串是否为空,不为空开始判断长度,定义len,依次遍历字符串,直到遇到'\0'(main中自己定义的),随后判断长度是否小于定于1,如果小于等于1就不用反转了,随后传入头指针str,和尾指针str+len-1

main中有几个关键的地方需要解释:

首先就是字符串的定义,和指针数组一样,因为数组也可以用来存储字符,定义完了之后分配空间(先分配100个)然后利用getchar()填入字符串,之后在字符串末尾定义'\0'(遍历时作为结束条件),此后重新分配内存,预防垃圾值,之后用%s,输出字符串即可(%c是输出字符的)

如果递归函数过程不理解的可以看我往期内容,链接如下:

(C语言)递归函数教学(C语言教学)-CSDN博客

运行结果如下:

请输入字符串:
asdasdasdasdfgjkgkjkddcvg
翻转之后是:gvcddkjkgkjgfdsadsadsadsa

请按任意键继续. . .

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!

你可能感兴趣的:(C语言(指针),C语言基础教学,c语言,开发语言,数据结构,算法,游戏)