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;
}

string類でよく使われる構造関数は、

string str;        //        

string str ("ABC")  //    str="ABC"<br>
string str ("ABC", strlen)  //  "ABC"  str ,     strlen   

string s("ABC",stridx,strlen)   // "ABC" stridx  ,       ,  str .     strlen   .

string s(strlen, 'A')  //  strlen 'A' str 
string類でよく使われるメンバー関数は以下の通りです。

str1.assign("ABC");        //  string ,    string  "ABC"

str1.length();                 //       

str1.size();            //       ,   length()

str1.capacity();          //    ,       string               

str1.resize(10);           //      string     ,            ,    \0      .
str1.resize(10,char c);     //     ,            ,    c      

str1.reserve(10);         //  string     ,      .
str1.swap(str2);              //  str1   str2     

str1.puch_back ('A');      // str1      'A'  ,         

str1.append ("ABC");       // str1      "ABC"   ,          

str1.insert ("ABC",2);       // str1    2   ,  "ABC"

str1.erase(2);             //     2   ,  : "ABCD" --> "AB"

str1.erase(2,1);              //    2     1 ,  : "ABCD"  --> "ABD"

str1.clear();              //    

str1.replace(2,4, "ABCD"); //    2   ,  4   , "ABCD"

str1.empty();            //    ,     true/*assign() :     ,               */
  str1.assign("HELLO");                   //str1="HELLO"
  str1.assign("HELLO", 4);                //str1="HELL" ,   4   
  str1.assign("HELLO", 2, 3);             //str1="LLO"    ,   2  ,   3   
  str1.assign(5, 'c');                    //str1="CCCCC"             //     
const char*c_str  
つの定数C文字列を返します。内容はこのストリングス列と同じです。
なお、本stringの内容が変更されたり、解析されたりすると、戻ってきた文字列も変更されません。この文字列は新たにnew char[]を通して出てきます。
下記のコードを参照すると、返ってきたC文字列のアドレスとstringの文字列のアドレスは全く違っています。

string* str = new string("ASD"); //str="ASD"
const char* c = str->c_str();

cout<<c<<endl;                 //   : "ASD"

printf("&c[0]=%p,&str[0]=%p
",&c[0],&str[0]); // :c=0x94bf024,&str[0]=0x94bf008 str->append("dd"); //str="ASDdd" cout<<c<<endl; // : "ASD" delete str; // cout<<c<<endl; // : "ASD"
反転相関(ヘッダファイルにある)

string str("hello");
reverse(str.begin(),str.end());
cout<< str <<endl;              //       ,  olleh
検索関連:

string str("ABCDEFGABCD");                      //11   
int n;<br>
/*        ,    , n  -1*/
/*find():         */
n= str.find('A');              //  "A",n=0;
n= str.find("AB");             //  "AB",n=0;
n= str.find("BC",1);           //   1 ,  "BC",n=1;
n= str.find("CDEfg",1,3);      //   1 ,  "CDEfg"  3   ,   str.find("CDE",1),n=2;

/*rfind():  (reverse)  ,      ,    */
n= str.rfind("CD");           //   10      ,n=9
n= str.rfind("CD",5);         //   5      ,n=2
n= str.rfind("CDEfg",5,3);    //   str.rfind("CDE",5);       ,  n=2


/* find_first_of ():  str               */
n= str.find_first_of("abcDefg");     //  str  3 'D',  "abcDefg" 'D',  n=3
n= str.find_first_of("abcDefg",1,4); //   str. find_first_of ("abcD",1);   n=3


/* find_last_of ():    ,       ,                  */
n= str.find_last_of("abcDefg");      //  str    10 'D',  n=10
n= str.find_last_of("abcDefg",5,4);  //   str. find_last_of ("abcD",5);   n=3


/* find_first_not_of ():          ,           str    ,     -1*/
n= str.find_last_not_of("ABC");    //  str  3'D',      ,   n=3
n= str.find_last_not_of("aABDC");  //  str  4 'F',      ,   n=4
n= str.find_last_not_of("aBDC");   //  str  0 'A',      ,   n=0
<br>
/* find_last_not_of ():            ,           str    ,     -1*/
n= str.find_last_not_of("aBDC");  //  str  7'A',      ,   n=7
コピー関連:

str2=str1.substr(2);        //    ,   str1    2   , str2

str2=str1.substr(2,3);     //    ,  str1    2  ,  3    str2

const char *s1= str.data();   // string        ,   s1
<br>
char *s=new char[10];
str.copy(s,count,pos);    // str  pos    ,  count   ,  s .
例1、ストリングスクラスを通じて文字列の循環右シフト機能を実現します。
たとえば:  "abcdefg「循環右シフト3ビット待ち」efgabcd「
コードは以下の通りです

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

string operator >>(const string& str,int n)
{
       string ret;
       n %= str.length();

       ret=str.substr(str.length()-n);              //        
       ret+=str.substr(0,str.length()-n);

       return ret;
}

int main()
{
       string str="abcdefg";
       string ret= str>>3 ;
       cout<<ret<<endl;

       return 0;
}

例2、ストリングスクラスによる文字列反転
例えば、「weトンナイトyou"->"ew;thgiot;uoy"
コードは以下の通りです

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

string reverse_func(const string& str)
{
       int end;
       int start=0;
       int len;
       string ret="";
       string tmp;

      while(1)
      {
         end=str.find(';',start);

         if(end== -1)          //   ;
        {
         len=str.length()-start;
         tmp=str.substr(start,len);

         reverse(tmp.begin(),tmp.end());   //     

         ret+=tmp;

         return ret;
        }
        else               //  ;
        {
         len=end-start;
         tmp=str.substr(start,len);

         reverse(tmp.begin(),tmp.end());     //     

         ret+=tmp+';';
         start=end+1;
        }

     }

}

int main()
{
       string str("we;tonight;you");

       string ret=reverse_func(str);

       cout<< ret<<endl;

       return 0;
}

練習問題:
要求:stringで完成します。テーマは以下の通りです

int main()
{
    cout << reverse("", ';') << endl;                 //   :    
    cout << reverse(";", ';') << endl;                //   :;
    cout << reverse("abcde;", ';') << endl;           //   :edcba;
    cout << reverse("we;tonight;you", ';') << endl;   //   :ew;thginot;uoy

    return 0;
}

コードと考え方を参照:
私達は観察して、reverse(",')関数は';'を伝達する必要があります。入力された文字列に';'があるかどうかを調べる必要があります。資料を調べてもらいました。
string類には確かにfindメンバー関数があります。その使い方は以下の通りです。
find():指定された1文字または1文字の配列を1文字列で検索します。見つかったら、最初のマッチの開始位置を返します。該当する内容が見つからなかったら、string::nposに戻ります。
1.stringであれば:npos出力空文字列
2.';'が見つかったら、また、位置1で出力します。文字列
3.find_ラスター.of():対象の列を検索して、指定された文字グループ内の任意の文字にマッチする最後の文字位置を返します。マッチした内容が検索されていない場合は、nposに戻ります。
4.逆転
5.最初に検索した後も後で検索します。count値=2の場合。レコードの位置
6.取ってください分割されたサブストリングのために、各文字列を逆順にします。
7.逆順:二分交換、またはアルゴリズムテンプレートでbegin:end
ブログ参照:https://www.cnblogs.com/lifexy/p/8642163.html
ここでC++文字列を反転させるいくつかの方法についての記事を紹介します。C++文字列を反転させる内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。