C++ 递归和非递归实现字符串反转 char *reverse(char *s)

简介: C++ 递归和非递归实现字符串反转 char *reverse(char *s)

头文件<cstring>(或<string.h>)中有字符串倒序函数的: strrev(char *s),但如何自定义实现呢?

#include <iostream>
#include <string>
#include <sstream>
#include <assert.h>
using namespace std;
char *reverse(char *s)
{
  assert(s!=NULL);
  static stringstream ss;
  if (*s!='\0') reverse(s+1);
  ss<<*(s-1);
  return (char*)ss.str().c_str();
}
char *strReverse(char *s)   
{
  assert(s!=NULL);
    char *t=s;
    while(*t) *t++;
    for(int i=0;i<(t-s)/2;i++){
        *t=*(s+i);
        *(s+i)=*(s+(t-s)-i-1);  //(t-s)指针减法,括号不能省
        *(s+(t-s)-i-1)=*t;
    }
    *(s+(t-s))='\0';
    return s;
}
int main(void)
{
  string s = "123456789";
  char *p = (char*)s.data();
  p=strReverse(p);
  cout<<p<<endl;
  cout<<reverse(p)<<endl;
  return 0;
}
/*
测试结果:
987654321
123456789
--------------------------------
Process exited after 0.5639 seconds with return value 0
请按任意键继续. . .
*/


网上看到的,还有这种递归写法,稍作修改也通过测试:

#include <iostream>
#include <cstring>
void reverse2(char *s,int n)
{
  if (n>1){
    char p=*s;
    *s=*(s+n-1);
    *(s+n-1)=p;
    reverse2(s+1,n-2);
  }
}
int main()
{
  char s[]="123456789";
  reverse2(s,strlen(s));  
  std::cout<<s<<std::endl;
  char *str;
  std::string t="hello,world!";
  str=(char*)t.c_str();
  reverse2(str,strlen(str));
  std::cout<<str<<std::endl;
  return 0;
}
/*
运行结果: 
987654321
!dlrow,olleh
--------------------------------
Process exited after 0.6639 seconds with return value 0
请按任意键继续. . .
*/
目录
相关文章
汉诺塔问题(递归)/梵塔问题c++
汉诺塔问题(递归)/梵塔问题c++
|
2月前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
121 3
|
25天前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
12天前
详细解读C++char类型函数
详细解读C++char类型函数
14 0
|
2月前
|
C++
【C++】std::string 转换成非const类型 char* 的三种方法记录
【C++】std::string 转换成非const类型 char* 的三种方法记录
31 0
|
2月前
|
C++
C++ 递归与面向对象编程基础
C++ 递归是函数自我调用的技术,用于简化复杂问题。以递归求和为例,`sum` 函数通过不断调用自身累加数字直到 `k` 为 0。递归需谨慎,避免无限循环和资源浪费。面向对象编程(OOP)将程序划分为交互对象,具有属性和方法,提升代码复用、维护和扩展性。C++ OOP 基本概念包括类、对象、属性和方法。通过创建类和对象,利用点语法访问成员,实现代码组织。
33 0
|
2月前
|
Java Go Python
Golang每日一练(leetDay0103) 区域和检索1~3
Golang每日一练(leetDay0103) 区域和检索1~3
38 0
Golang每日一练(leetDay0103) 区域和检索1~3
|
2月前
|
Java Go C++
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
36 0
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
|
2月前
|
算法 C++ Java
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
29 0
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题