字符串逆序(递归实现)

news/2025/3/16 2:19:31/

字符串逆序(递归实现)
编写一个函数 reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如 :
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
想法:在想递归之前,我们要先想常规方法要怎么做,首先编写函数求字符串的长度,然后让第一个元素和最后一个,第二个和倒数第二个交换,以此类推
代码:

#include<stdio.h>int Strlenth(char Str[]) {int count = 0;int i = 0;while (Str[i]!='\0'){count++;i++;}return count;
}void reverse_string(char* string) {char tmp;int len = Strlenth(string);tmp = *string;*string = *(string + len - 1);*(string + len - 1) = '\0';if (Strlenth(string+1)>1){reverse_string(string + 1);}*(string + len - 1) = tmp;//思考为什么以下写法结果会错误/*tmp = *string;*string = string[Strlenth(string) - 1];string[Strlenth(string) - 1] = '\0';if (Strlenth(string + 1) > 1){reverse_string(string + 1);}string[Strlenth(string) - 1] = tmp;*/
}
int main(){char Str[] = { "abcdefg"};reverse_string(Str);printf("%s\n", Str);return 0;
}

遇到的问题:

    tmp = *string;*string = string[Strlenth(string) - 1];string[Strlenth(string) - 1] = '\0';if (Strlenth(string + 1) > 1){reverse_string(string + 1);}string[Strlenth(string) - 1] = tmp;

为什么这种写法会出现错误?
因为上述两个语句
1.string[Strlenth(string) - 1] = ‘\0’;
2.string[Strlenth(string) - 1] = tmp;
在同一次调用的过程中,它们的string[Strlenth(string) - 1] 得到的值并不相同,有\0的阻挡,它的长度发生了变化。而第一种方法用的是地址,不受\0的影响
若想继续这样用需改为以下代码

tmp = *string;*string = string[Strlenth(string) - 1];string[Strlenth(string) - 1] = '\0';if (Strlenth(string + 1) > 1){reverse_string(string + 1);}string[Strlenth(string)] = tmp;//修改了这句,使长度和原来相同

http://www.ppmy.cn/news/1172911.html

相关文章

Web APIs——事件监听以及案例

1、事件监听 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为绑定事…

【C++】二叉树进阶 -- 详解

一、二叉搜索树概念 二叉搜索树 又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点…

Spring Security—OAuth2 客户端认证和授权

一、认证—JWT Bearer 关于 JWT Bearer 客户端认证的进一步详情&#xff0c;请参考OAuth 2.0客户端认证和授权许可的 JSON Web Token (JWT)简介。 JWT Bearer 客户端认证的默认实现是 NimbusJwtClientAuthenticationParametersConverter&#xff0c;它是一个 Converter&#…

Golang 中 Error 的设计及最佳实践

如果你对于 Go 的 Error 设计不太熟悉也不习惯&#xff0c;为什么许多接口都需要返回 error 接口类型的值呢&#xff1f;什么时候该处理 error&#xff0c;什么时候该抛出 error&#xff0c;什么时候又该忽略 error &#xff1f;Go 设计者又为什么要这样设计 error 呢&#xff…

uniapp中nvue页面使用fixed后,数据更改不更新到该视图。

解决方案&#xff1a;position: fixed;定位改成position: absolute; 记录一下&#xff0c;遇到这个贼离谱的问题&#xff0c;uniapp项目里的nvue页面因为要弄个引导蒙版&#xff0c;所以使用了fixed定位&#xff0c;点击蒙版关闭&#xff0c;加了this.$forceUpdate()也不行&am…

一文了解AIGC与ChatGPT

一、AIGC简介 1.AIGC基础 (1)AIGC是什么 AIGC是人工智能图形计算的缩写&#xff0c;是一种基于图形处理器&#xff08;GPU&#xff09;的计算技术&#xff0c;可以加速各种计算任务&#xff0c;包括机器学习、深度学习、计算机视觉等。 AIGC是一种基于GPU的计算技术&#x…

mybatis对查询的数据手动分页

项目开发中有时候由于查询的数据比较复杂,可能会对查询的到的数据进行一些处理,比如合并,或者筛选掉一部分的数据,那么就无法再查询的时候去进行分页了&#xff0c;而需要将处理之后的集合数据,进行手动分页处理&#xff0c;以下是手动处理分页的案例参考: Page<返回的实体对…

安卓 实现60s倒计时的CountDownTimer(小坑)

安卓 实现60s倒计时的CountDownTimer&#xff08;小坑&#xff09; 前言一、CountDownTimer 是什么&#xff1f;二、代码示例1.使用2.小坑的点误差及时取消 总结 前言 前段时间写倒计时没有用线程&#xff0c;想换一种实现方式结果踩了个小坑&#xff0c;特此记录。 一、Count…