• C++ 反转字符串(原创)


    //通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识

    /*分析过程:

      假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度

      相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转

    */

    /*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型*/

    //直接使用字符数组赋值
    char* strrev1(const char* str)
    {
       const size_t length = strlen(str);//求字符长度
       char *temp = new char[length];//新建一个等长度的字符数组
       strcpy(temp,str);//字符串拷贝
       for (size_t i = 0; i <= length/2; ++i)//对字符数组中的字符反转,循环执行条件为标识小于或等于字符长度一半
       {
          char c = temp[i];
          temp[i] = temp[length - i -1];
          temp[length - i -1] = c;
       }
       return temp;//返回反转后的字符
    }

    //采用指针操作方式
    char* strrev2(const char* str)
    {
       char* tmp = new char[strlen(str)]; 
       strcpy(tmp,str); 

       char* ret = tmp;//用来最后返回数组指针
       char* p = tmp + strlen(str) - 1;
       while (p > tmp)  
       {  
          char t = *tmp;  
          *tmp++ = *p;  
          *p-- = t;
       }
       return ret;
    }

    //与上一函数基本相似,只不过本函数使用是移位操作改变字符指针指向
    char* strrev3(const char* str)

       char* tmp = new char[strlen(str) + 1];
       strcpy(tmp,str); 
       char* ret = tmp;
       char* p = tmp + strlen(str) - 1;
       while (p > tmp)  
       {  
          *p ^= *tmp;
          *tmp++ ^= *p;           
          *p-- ^= *tmp;
       } 
       return ret;
    }

    //节省几步,直接给新建的字符数组赋反转的值,呵呵,简单明了,只不过循环多执行几次
    char* strrev4(const char* str)

       char * temp = new char[strlen(str)]; 
       for(int i = 0; i <= strlen(str); i++)
       {
          temp[i] = str[strlen(str) - i -1];
       }
       return temp;
    }

    //使用递归进行字符反转,网上看的,不过感觉不好,限制太多

    //(不能直接反转常量字符串,因为没有定义新的字符数组,而是在原数组上直接进行字符反转,节省空间,提高效率,还要传递字符长度,增加限制,但总归是个思路)
    char* strrev5 (char* str,int len)
    {
       if (len <= 1)
          return str;
       char t = *str; 
       *str = *(str + len -1); 
       *(str + len -1) = t; 
       return (strrev5(str + 1,len - 2) - 1); 
    }

    /*如果传递是std::string类型字符串且是const的!!

      返回类型为std::string

    */

    std::string strrev6(const std::string str)

    {

      string r ;//定义一个新的字符串变量,用来接收

      string r;
       for(int i = 0; i < str.length(); ++i)
       {
          r = str[i] + r;//注意顺序
       }
      return r;

    }

    /*如果传递是std::string类型字符串,但不是const的!!

      返回类型为std::string,那你将不必再定义一个新的字符串变量

      节省空间,注意:string类型可以直接接受字符串字面值就是啦..

    */

    std::string strrev6(std::string str)

    {

      for(int i = 0; i <= str.length()/2; ++i)
       {
          char c = str[i];
          str[i] = str[str.length() - i -1];
          str[str.length() - i - 1] = c;
         }
       return str;

    }

  • 相关阅读:
    自己改了个{svn服务器端绿色版}
    Android去掉顶部的阴影
    SqliteOpenHelper的onUpgrade()死活不运行的解法
    前端模拟发送数据/调试的好工具:Chrome下的PostmanREST Client
    mouseenter & mouseleave VS mouseover & mouseout
    Android WindowManager$BadTokenException异常应对案例
    Eclipse快捷键大全(转载)
    360桌面JSAPI一个诡异的bug:客户端与网页通过js通信
    《你在哪》1.34强势发布,新增“图片墙”
    经过一个月的奋斗,我的第一个Android作品《麦芒》诞生了
  • 原文地址:https://www.cnblogs.com/gaojun/p/1702930.html
Copyright © 2020-2023  润新知