C++中STL中string类的使用

要想使用标准C++中string类,必须要包含
#include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件
using  std::string;
using  std::wstring;

using namespace std;

构造函数
string();
string( size_type length, char ch );
string( const char *str );
string( const char *str, size_type length );
string( string &str, size_type index, size_type length );
string( input_iterator start, input_iterator end );

字符串的构造函数创建一个新字符串,包括:
•    以length为长度的ch的拷贝(即length个ch)
•    以str为初值 (长度任意),
•    以index为索引开始的子串,长度为length, 或者
•    以从start到end的元素为初值.
例如,
 
    string str1( 5, 'c' );
    string str2( "Now is the time..." );
    string str3( str2, 11, 4 );
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;

可以用 ==, >, <, >=, <=, and !=比较字符串. 可以用 + 或者 += 操作符连接两个字符串, 并且可以用[]获取特定的字符.
添加文本(append)
语法:
  basic_string &append( const basic_string &str );
  basic_string &append( const char *str );
  basic_string &append( const basic_string &str, size_type index, size_type len );
  basic_string &append( const char *str, size_type num );
  basic_string &append( size_type num, char ch );
  basic_string &append( input_iterator start, input_iterator end );

append() 函数可以完成以下工作:
•    在字符串的末尾添加str,
•    在字符串的末尾添加str的子串,子串以index索引开始,长度为len
•    在字符串的末尾添加str中的num个字符,
•    在字符串的末尾添加num个字符ch,
•    在字符串的末尾添加以迭代器start和end表示的字符序列.
例如以下代码:
 
    string str = "Hello World";
    str.append( 10, '!' );
    cout << str << endl;
显示
    Hello World!!!!!!!!!!
赋值(assign)
语法:
  basic_string &assign( const basic_string &str );
  basic_string &assign( const char *str );
  basic_string &assign( const char *str, size_type num );
  basic_string &assign( const basic_string &str, size_type index, size_type len );
  basic_string &assign( size_type num, char ch );

函数以下列方式赋值:
•    用str为字符串赋值,
•    用str的开始num个字符为字符串赋值,
•    用str的子串为字符串赋值,子串以index索引开始,长度为len
•    用num个字符ch为字符串赋值.
例如以下代码:
 
    string str1, str2 = "War and Peace";
    str1.assign( str2, 4, 3 );  
    cout << str1 << endl;
显示
    and
at
语法:
  reference at( size_type index );

at()函数返回一个引用,指向在index位置的字符. 如果index不在字符串范围内, at() 将报告"out of range"错误,并抛出out_of_range异常。 比如下列代码:
    string text = "ABCDEF";
    char ch = text.at( 2 );
显示字符 'C'.
begin
语法:
  iterator begin();

begin()函数返回一个迭代器,指向字符串的第一个元素.
c_str
语法:
  const char *c_str();

c_str()函数返回一个指向正规C字符串的指针, 内容与本字符串相同.
容量(capacity)
语法:
  size_type capacity();

capacity()函数返回在重新申请更多的空间前字符串可以容纳的字符数. 这个数字至少与 size()一样大.
查找(find)
语法:
  size_type find( const basic_string &str, size_type index );
  size_type find( const char *str, size_type index );
  size_type find( const char *str, size_type index, size_type length );
  size_type find( char ch, size_type index );

find()函数:
•    返回str在字符串中第一次出现的位置(从index开始查找)。如果没找到则返回string::npos,
•    返回str在字符串中第一次出现的位置(从index开始查找,长度为length)。如果没找到就返回string::npos,
•    返回字符ch在字符串中第一次出现的位置(从index开始查找)。如果没找到就返回string::npos
例如,
 
    string str1( "Alpha Beta Gamma Delta" );
    unsigned int loc = str1.find( "Omega", 0 );
    if( loc != string::npos )
      cout << "Found Omega at " << loc << endl;
    else
      cout << "Didn't find Omega" << endl;
插入(insert)
语法:
  iterator insert( iterator i, const char &ch );
  basic_string &insert( size_type index, const basic_string &str );
  basic_string &insert( size_type index, const char *str );
  basic_string &insert( size_type index1, const basic_string &str, size_type index2, size_type num );
  basic_string &insert( size_type index, const char *str, size_type num );
  basic_string &insert( size_type index, size_type num, char ch );
  void insert( iterator i, size_type num, const char &ch );
  void insert( iterator i, iterator start, iterator end );

insert()函数的功能非常多:
•    在迭代器i表示的位置前面插入一个字符ch,
•    在字符串的位置index插入字符串str,
•    在字符串的位置index插入字符串str的子串(从index2开始,长num个字符),
•    在字符串的位置index插入字符串str的num个字符,
•    在字符串的位置index插入num个字符ch的拷贝,
•    在迭代器i表示的位置前面插入num个字符ch的拷贝,
•    在迭代器i表示的位置前面插入一段字符,从start开始,以end结束.
替换(replace)
语法:
  basic_string &replace( size_type index, size_type num, const basic_string &str );
  basic_string &replace( size_type index1, size_type num1, const basic_string &str, size_type index2,
  size_type num2 );
  basic_string &replace( size_type index, size_type num, const char *str );
  basic_string &replace( size_type index, size_type num1, const char *str, size_type num2 );
  basic_string &replace( size_type index, size_type num1, size_type num2, char ch );
  basic_string &replace( iterator start, iterator end, const basic_string &str );
  basic_string &replace( iterator start, iterator end, const char *str );
  basic_string &replace( iterator start, iterator end, const char *str, size_type num );
  basic_string &replace( iterator start, iterator end, size_type num, char ch );

replace()函数:
•    用str中的num个字符替换本字符串中的字符,从index开始
•    用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,最多num1个字符
•    用str中的num个字符(从index开始)替换本字符串中的字符
•    用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,num1个字符
•    用num2个ch字符替换本字符串中的字符,从index开始
•    用str中的字符替换本字符串中的字符,迭代器start和end指示范围
•    用str中的num个字符替换本字符串中的内容,迭代器start和end指示范围,
•    用num个ch字符替换本字符串中的内容,迭代器start和end指示范围.
例如,以下代码显示字符串"They say he carved it himself...find your soul-mate, Homer."
    string s = "They say he carved it himself...from a BIGGER spoon";
    string s2 = "find your soul-mate, Homer.";

    s.replace( 32, s2.length(), s2 );

    cout << s << endl;
size
语法:
  size_type size();

size()函数返回字符串中现在拥有的字符数。
substr
语法:
  basic_string substr( size_type index, size_type num = npos );

substr()返回本字符串的一个子串,从index开始,长num个字符。如果没有指定,将是默认值 string::npos。这样,substr()函数将简单的返回从index开始的剩余的字符串。
例如:
    string s("What we have here is a failure to communicate");

    string sub = s.substr(21);

    cout << "The original string is " << s << endl;
    cout << "The substring is " << sub << endl;
显示:
    The original string is What we have here is a failure to communicate
    The substring is a failure to communicate
交换(swap)
语法:
  void swap( basic_string &str );

swap()函数把str和本字符串交换。例如:
    string first( "This comes first" );
    string second( "And this is second" );
    first.swap( second );
    cout << first << endl;
    cout << second << endl;
显示:
    And this is second
    This comes first
data
语法:
  const char *data();

data()函数返回指向自己的第一个字符的指针.

/* string函数演示 */

/*****************************************
 * Copyright (C) 2018 * Ltd. All rights reserved.
 *
 * File name   : string.cpp
 * Author      : longbin
 * Created date: 2018-08-01 19:01:50
 * Description :
 *
 *******************************************/
#include <cstring>
#include <cstdlib>
#include <iostream>

#include <string>
#include <vector>
using namespace std;

#define print(x) std::cout<<__func__<<">>"<<__LINE__<<">>"<<#x<<"("<<x<<")"<<std::endl

typedef struct {
    int type;
    int status;
    string number;
} CallInfo;

void string_construct()
{
    // default (1)    string();
    // copy (2)       string (const string& str);
    // substring (3)  string (const string& str, size_t pos, size_t len = npos);
    // from c-string (4) string (const char* s);
    // from sequence (5) string (const char* s, size_t n);
    // fill (6)          string (size_t n, char c);
    // range (7) template <class InputIterator>
    //                   string  (InputIterator first, InputIterator last);

    string str0("hello c++ string");
    print(str0);
    // 1 empty string constructor (default constructor)
    // Constructs an empty string, with a length of zero characters.
    string str1;
    print(str1);
    // strcpy(str1, "hello c++ string str1."); // error
    // str1 = str0; // OK

    // 2 copy constructor
    // Constructs a copy of str.
    string str2(str0);
    print(str2);

    // 3 substring constructor
    string str3(str0, 3, 5); // 位置+长度
    print(str3);

    // 4 from c-string
    // Copies the null-terminated character sequence (C-string) pointed by s.
    string str4("hello c++ string from c-string");
    print(str4);

    // 5 from buffer
    // Copies the first n characters from the array of characters pointed by s.
    string str5("hello c++ string from c-string buf", 20); //长度
    print(str5);

    // 6 fill constructor
    // Fills the string with n consecutive copies of character c.
    string str6(6, 's');
    print(str6);

    // 7 range constructor
    // Copies the sequence of characters in the range [first,last), in the same order.
    string str7(str0.begin(), str0.begin()+5);
    print(str7);
    // string_construct>>30>>str0# hello c++ string
    // string_construct>>34>>str1#
    // string_construct>>41>>str2# hello c++ string
    // string_construct>>45>>str3# lo c+
    // string_construct>>50>>str4# hello c++ string from c-string
    // string_construct>>55>>str5# hello c++ string fro
    // string_construct>>60>>str6# ssssss
    // string_construct>>65>>str7# hello
}

void string_assign()
{
    //string (1)      string& operator= (const string& str);
    //c-string (2)    string& operator= (const char* s);
    //character (3)   string& operator= (char c);
    string s1, s2, s3;
    s1 = "string test"; // (2)
    s2 = 't';           // (3)
    s3 = s1 + s2;       // (1)
    string s = "hello"; // 1 empty string constructor 2. c-string assign;

    // string (1)     string& assign (const string& str);
    // substring (2)  string& assign (const string& str, size_t subpos, size_t sublen);
    // c-string (3)   string& assign (const char* s);
    // buffer (4)     string& assign (const char* s, size_t n);
    // fill (5)       string& assign (size_t n, char c);
    // range (6)  template <class InputIterator>
    //                string& assign (InputIterator first, InputIterator last);

    string base = "c++ string assign test";
    string str;
    char str7[] = "hello str7.";

    str.assign(base);                   // (1)
    print(str);
    str.assign(base, 4, 6);             // (2) 位置+长度
    print(str);
    str.assign("assign from c-string"); // (3)
    print(str);
    str.assign(str7);                   // (3)
    print(str);

    str.assign("assign from buffer", 20); // (4) 长度
    print(str); // assign from bufferh
    str.assign(8, '*');                   // (5)
    print(str);
    // str.assign<int>(10, 0x2D);            // (5)
    print(str); // ----------
    str.assign(base.begin()+4, base.end()); // (6)
    print(str);
}

void string_clear()
{
    return;
    // Erases the contents of the string, which becomes an empty string (with a length of 0 characters).
    char c;
    std::string str;
    std::cout << "Please type some lines of text. Enter a dot (.) to finish:\n";
    do {
        c = std::cin.get();
        str += c;
        if (c=='\n')
        {
            std::cout << str;
            str.clear();
        }
    } while (c!='.');
}

void string_c_str()
{
    // Get C string equivalent
    // Returns a pointer to an array that contains a null-terminated sequence of characters (i.e., a C-string) representing the current value of the string object.
    // This array includes the same sequence of characters that make up the value of the string object plus an additional terminating null-character ('\0') at the end.
    string str1 = "hello c++ string c_str()";
    print(str1);
    print(str1.c_str());

    char buf[128] = {0};
    // strcpy(buf, str1); // error
    strcpy(buf, str1.c_str()); // OK
    print(buf);

    char * cstr = new char[str1.length() + 1];
    strcpy(cstr, str1.c_str()); // cstr now contains a c-string copy of str
    print(cstr);
}

void string_data()
{
    // c_str() 返回的字符串数组以'\0'结尾, data()难以保证,不一定以'\0'结尾,慎用;
    // Returns a pointer to an array that contains the same sequence of characters as the characters that make up the value of the string object.
    // Accessing the value at data()+size() produces undefined behavior: There are no guarantees that a null character terminates the character sequence pointed by the value returned by this function. See string::c_str for a function that provides such guarantee.
    string str = "hello c++ string";
    const char *p = "hello c++ string";

    if (str.length() == strlen(p))
    {
        cout << "str and p have the same length." << endl;
        if (memcmp(p, str.data(), str.length()))
        {
            cout << "str and p have the same content." << endl;
        }
    }
}

void string_at()
{
    // Get character in string
    // Returns a reference to the character at position pos in the string.
    string str1 = "1234567890";

    print(str1);       //1234567890
    print(str1.at(3)); //4
    // print(str1.at(str1.length())); // out of range

    print(str1[3]);
    // print(str1[-1]); //空
}

void string_begin_end()
{
    string str1 = "1234567890";

    string::iterator it;
    for (it = str1.begin(); it != str1.end(); it++)
    {
        print(*it);
    }
    print(*str1.begin());   //1
    print(*str1.end());     //
    print(*(str1.end()-1)); //0
}

void string_append()
{
    // string (1)    string& append (const string& str);
    // substring (2) string& append (const string& str, size_t subpos, size_t sublen);
    // c-string (3)	 string& append (const char* s);
    // buffer (4)    string& append (const char* s, size_t n);
    // fill (5)	     string& append (size_t n, char c);
    // range (6) template <class InputIterator>
    //               string& append (InputIterator first, InputIterator last);
    string str1 = "hello ";
    string str2 = "c++ ";
    print(str1);
    print(str2);

    str1.append(str2);                                   // (1)
    cout << "str1.append(str2): " << str1 << endl;       //hello c++

    str1.append(str2, 1, 2);                             // (2)
    cout << "str1.append(str2, 1, 2): " << str1 << endl; //hello c++ ++

    str1.append("good");                                 // (3)
    cout << "str1.append(\"good\"): " << str1 << endl;   //hello c++ ++good

    str1.append("good", 3);                              // (4)
    cout << "str1.append(\"good\", 3): " << str1 << endl;//hello c++ ++goodgoo

    str1.append(5, '-');                                 // (5)
    cout << "str1.append(5, '-'): " << str1 << endl;     //hello c++ ++goodgoo-----

    str1.append(str2.begin()+1, str2.end()-1);           // (6)
    cout << "str1.append(str2.begin()+1, str2.end()-1): " << str1 << endl; //hello c++ ++goodgoo-----++
}

void string_replace()
{
    // string (1)	string& replace (size_t pos,  size_t len,  const string& str);
    //              string& replace (iterator i1, iterator i2, const string& str);
    // substring (2)  string& replace (size_t pos,  size_t len,  const string& str, size_t subpos, size_t sublen);
    // c-string (3)   string& replace (size_t pos,  size_t len,  const char* s);
    //                string& replace (iterator i1, iterator i2, const char* s);
    // buffer (4)	string& replace (size_t pos,  size_t len,  const char* s, size_t n);
    //              string& replace (iterator i1, iterator i2, const char* s, size_t n);
    // fill (5)	      string& replace (size_t pos,  size_t len,  size_t n, char c);
    //                string& replace (iterator i1, iterator i2, size_t n, char c);
    // range (6)  template <class InputIterator>
    //                string& replace (iterator i1, iterator i2, InputIterator first, InputIterator last);

    //                  0123456789*23456789*123
    std::string base = "this is a test string.";
    std::string str2 = "n example";
    std::string str3 = "sample phrase";
    std::string str4 = "useful.";

    // replace signatures used in the same order as described above:
    // 位置参数的前2个表示替换范围,后面是使用的字符串
    // Using positions:                   0123456789*123456789*12345
    std::string str = base;           // "this is a test string."
    str.replace(9, 5, str2);          // "this is an example string." (1) str[9:+5]   <-- str2;
    str.replace(19, 6, str3, 7, 6);   // "this is an example phrase." (2) str[19:+6]  <-- str3[7:+6];
    str.replace(8, 10, "just a");     // "this is just a phrase."     (3) str[8:+10]  <-- "just a";
    str.replace(8, 6, "a shorty", 7); // "this is a short phrase."    (4) str[8:+6]   <-- "a shorty"[:+7];
    str.replace(22, 1, 3, '!');       // "this is a short phrase!!!"  (5) str[22:+1]  <-- 3*'!';

    // Using iterators:                                                  0123456789*123456789*
    str.replace(str.begin(), str.end()-3, str3);                     // "sample phrase!!!"      (1)
    str.replace(str.begin(), str.begin()+6, "replace");              // "replace phrase!!!"     (3)
    str.replace(str.begin()+8, str.begin()+14,"is coolness", 7);     // "replace is cool!!!"    (4)
    str.replace(str.begin()+12, str.end()-4, 4, 'o');                // "replace is cooool!!!"  (5)
    str.replace(str.begin()+11, str.end(), str4.begin(), str4.end());// "replace is useful."    (6)
    print(str); // replace is useful.
}

void string_capacity()
{
    // Return size of allocated storage
    //     Returns the size of the storage space currently allocated for the string, expressed in terms of bytes.
    // The capacity of a string can be explicitly altered by calling member reserve.
    string str1 = "hello c++ string.";

    print(str1.length());
    print(str1.size()); // <==> length()
    print(str1.capacity());
    print(str1.max_size());

    str1 = "0123456789*123456789*123456789*123456789";
    print(str1.length());   //40
    print(str1.capacity()); //40

    str1 = "hello c++";
    print(str1.length());   //9
    print(str1.capacity()); //40

    CallInfo info;
    // c++ string 作为结构体时, 需要使用new而不是malloc来申请空间
    info.type = 5;
    info.status = 6;
    info.number = "123456789012";
    print(sizeof(info)); //16

    string str_hello = "hello world";
    print(str_hello);
    print(sizeof(str_hello)); //8

    string crash = "hello";
    print(crash);
    crash.clear();
    print(crash);
    // 用sizeof来返回类型以及静态分配的对象/结构/数组所占的空间,返回值跟对象/结构/数组所存储的内容没有关系;
    // 当参数分别如下时,sizeof返回的值表示的含义如下:
    //     数组——编译时分配的数组空间大小;
    //     指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    //     类型——该类型所占的空间大小;
    //     对象——对象的实际占用空间大小;
    //     函数——函数的返回类型所占的空间大小。函数的返回类型不能是void;
    char arr0[20] = "hello arr0";
    char arr1[]   = "hello arr1";
    char *pstr = new char[20];
    strcpy(pstr, arr0);
    //sizeof不是一个函数,sizeof可以不加括号;sizeof更像一个特殊的宏,它是在编译阶段求值的;
    //注意sizeof()中的语句不会生效;
    //sizeof(string)和字符串的长度是无关的,在一个系统中所有的sizeof(string)是一个固定值;
    //这个和编译器相关,string字符串是存储在堆上,这个属于动态分配的空间;
    string sstr = "hello sstr";

    print(sizeof(arr0)); //20
    print(sizeof(arr1)); //11
    print(sizeof(pstr)); //8
    print(sizeof(sstr)); //8
    print(sstr);
    sizeof(sstr = "sizeof expr");
    print(sstr); //"hello sstr"
}

void string_length()
{
    // Return length of string
    //     Returns the length of the string, in terms of bytes.

    //          0123456789*12345
    string str("hello c++ string");
    print(str.length()); //16
}

void string_size()
{
    // Return length of string
    //     Returns the length of the string, in terms of bytes.

    //          0123456789*12345
    string str("hello c++ string");
    print(str.size()); //16
    // length是因为沿用C语言的习惯而保留下来的,string类最初只有length;
    // 引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法;
    // string类的size()/length()方法返回的是字节数,不管是否有汉字;
}

void string_erase()
{
    // sequence (1)    string& erase (size_t pos = 0, size_t len = npos);
    //           Erases the portion of the string value that begins at the character position pos and spans len characters;
    //           or until the end of the string, if either the content is too short or if len is string::npos.
    //           Notice that the default argument erases all characters in the string (like member function clear).
    //  character (2)  iterator erase (iterator p);
    //           Erases the character pointed by p.
    //  range (3)	   iterator erase (iterator first, iterator last);
    //           Erases the sequence of characters in the range [first,last).

    //          0123456789*123456789*123
    string str("hello c++ string example");
    print(str);

    str.erase(17, 7);             // (1)
    print(str); //hello c++ string
    str.erase(str.begin()+10);    // (2) Erases the character pointed by p.
    print(str); //hello c++ tring
    str.erase(str.begin()+6, str.begin()+8); // (3)
    print(str); //hello + tring
    str.erase();                  // (1) <==> str.clear();
    print(str); //
}

void string_insert()
{
    // string (1)     string& insert (size_t pos, const string& str);
    // substring (2)  string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
    // c-string (3)   string& insert (size_t pos, const char* s);
    // buffer (4)     string& insert (size_t pos, const char* s, size_t n);
    // fill (5)     string& insert (size_t pos, size_t n, char c);
    //                 void insert (iterator p, size_t n, char c);
    // single character (6)	iterator insert (iterator p, char c);
    // range (7)	template <class InputIterator>
    //                 void insert (iterator p, InputIterator first, InputIterator last);

    //                  0123456789*123
    std::string str  = "to be question";
    std::string str2 = "the ";
    std::string str3 = "or not to be";
    std::string::iterator it;

    // used in the same order as described above:
    //                                             0123456789*123456789*123456789
    str.insert(6, str2);                 // (1) // to be the question
    print(str);
    str.insert(6, str3, 3, 4);           // (2) // to be not the question
    str.insert(10, "that is cool", 8);   // (4) // to be not that is the question
    str.insert(10, "to be ");            // (3) // to be not to be that is the question
    str.insert(15, 1, ':');              // (5) // to be not to be: that is the question
    it = str.insert(str.begin()+5, ','); // (6) // to be, not to be: that is the question
    str.insert(str.end(), 3, '.');       // (5) // to be, not to be: that is the question...
    str.insert(it+2, str3.begin(), str3.begin()+3); // (7) // to be, or not to be: that is the question...
    print(str);
}

void string_empty()
{
    // Test if string is empty
    //     Returns whether the string is empty (i.e. whether its length is 0).
    string str0 = "hello c++ string";
    string str1 = str0;
    string str2 = "";
    string str3;

    print(str0.empty()); // 0
    print(str1.empty()); // 0
    print(str2.empty()); // 1
    print(str3.empty()); // 1

    str0.erase();
    print(str0.empty()); // 1
    str1.clear();
    print(str1.empty()); // 1
}

void string_compare()
{
    // Compare strings
    //Compares the value of the string object (or a substring) to the sequence of characters specified by its arguments.

    // string (1)       int compare (const string& str) const;
    // substrings (2)   int compare (size_t pos, size_t len, const string& str) const;
    //                  int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;
    // c-string (3)     int compare (const char* s) const;
    //                  int compare (size_t pos, size_t len, const char* s) const;
    // buffer (4)       int compare (size_t pos, size_t len, const char* s, size_t n) const;
    string str0 = "hello c++ string 0";
    string str1 = "hello c++ string 1";
    string str2 = "hello c++ string 2";
    string str3 = "hello c++ string 0";
    string str4 = "c++";

    print(str1.compare(str2));                  // (1) // <0
    print(str0.compare(str3));                  // (1) // ==0
    print(str2.compare(str1));                  // (1) // >0
    print(str0.compare(6, 3, str4));            // (2) // ==0
    print(str0.compare(6, 3, str1, 6, 3));      // (2) // ==0
    print(str0.compare("hello c++ string 0"));  // (3) // ==0
    print(str0.compare(6, 3, "c++"));           // (3) // ==0
    print(str0.compare(6, 3, "c++ good", 3));   // (4) // ==0
}

void string_copy()
{
    // size_t copy (char* s, size_t len, size_t pos = 0) const;
    // Copy sequence of characters from string
    // The function does not append a null character at the end of the copied content.
    char buf[128] = "9876543210";
    string str1 = "0123456789";
    print(str1);

    size_t size = str1.copy(buf, 4, 3); //str len index
    print(buf);         // 3456543210
    print(strlen(buf)); // 10
    print(size);        // 4
    buf[size] = '\0';
    print(buf);         // 3456
    print(strlen(buf)); // 4

    // std::copy()
    // template <class InputIterator, class OutputIterator>
    //          OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
    // Copy range of elements
    //   Copies the elements in the range [first,last) into the range beginning at result.]
    string str = "9876543210";
    std::copy(str1.begin()+3, str1.begin()+7, str.begin()); // [3, 7); // no '\0' end;
    print(str);                // 3456543210
    print(strlen(str.data())); // 10
    print(str.length());       // 10

    str.assign(str1, 3, 4);
    print(str);                // 3456
    print(strlen(str.data())); // 4
    print(str.length());       // 4
}

void string_find()
{
    // Find content in string
    //   Searches the string for the first occurrence of the sequence specified by its arguments.
    // Return Vaulue:
    //   The position of the first character of the first match.
    //   If no matches were found, the function returns string::npos.
    // string (1)    size_t find (const string& str, size_t pos = 0) const;
    // c-string (2)  size_t find (const char* s, size_t pos = 0) const;
    // buffer (3)    size_t find (const char* s, size_t pos, size_t n) const;
    // character (4) size_t find (char c, size_t pos = 0) const;
    string str = "hello c++ string find c++";
    string f1 = "c++";
    size_t fpos = 0;

    fpos = str.find(f1);                             // (1)
    cout << "first c++ found at: " << fpos << endl;
    fpos = str.find(f1, fpos+1);                     // (1)
    cout << "second c++ found at: " << fpos << endl;

    fpos = str.find("c++");                          // (2)
    cout << "c++ found at: " << fpos << endl;
    fpos = str.find("c++", 2);                       // (2)
    cout << "c++ found at: " << fpos << endl;

    fpos = str.find("c++ good", 7, 3);               // (3) //str[pos:] "c++ good"[:3]
    cout << "c++ found at: " << fpos << endl;// 22   // found "c++" from "hello c(++ string find c++)"

    fpos = str.find('+', 15);                        // (4)
    cout << "+ found at: " << fpos << endl;  // 23   // found '+' from "hello c++ strin(g find c++)"
}

void string_substr()
{
    // string substr (size_t pos = 0, size_t len = npos) const;
    // Generate substring
    // Returns a newly constructed string object with its value initialized to a copy of a substring of this object.
    string str1 = "hello c++ string substr.";
    string sub;
    size_t pos;

    pos = str1.find("c++", 0);
    sub = str1.substr(pos);
    print(sub);

    sub = str1.substr(pos, 3);
    print(sub);

    string info(17, '6');
    size_t step = 6;
    // string info(20, '6');
    // size_t step = 20;
    for (pos = 0; pos < info.length(); pos+=step)
    {
        cout << pos << ": " << info.substr(pos, step) << endl;
    }
}

std::vector<std::string> split(std::string &line, const std::string & delim)
{
    size_t pstart = 0;
    size_t phit = 0;
    std::string sstr;
    size_t length = line.length();
    std::vector<std::string> vstr;

    vstr.clear();
    for (;pstart <= length;)
    {
        phit = line.find(delim, pstart);
        if (std::string::npos != phit)
        {
            /* find delim, get substr */
            sstr = line.substr(pstart, phit-pstart);
            vstr.push_back(sstr);
            pstart = phit + delim.size();
        } else {
            /* not find delim, append remaining str and break */
            vstr.push_back(line.substr(pstart));
            break;
        }
    }
    return vstr;
}

size_t split(const std::string &line, const std::string &delim, std::vector<std::string> &vstr)
{
    size_t pstart = 0;
    size_t phit = 0;
    std::string sstr;
    size_t length = line.length();

    vstr.clear();
    for (;pstart <= length;)
    {
        phit = line.find(delim, pstart);
        if (std::string::npos != phit)
        {
            /* find delim, get substr */
            sstr = line.substr(pstart, phit-pstart);
            vstr.push_back(sstr);
            pstart = phit + delim.size();
        } else {
            /* not find delim, append remaining str and break */
            vstr.push_back(line.substr(pstart));
            break;
        }
    }
    return vstr.size();
}

    template <class T>
std::string join(T& val, std::string delim)
{
    std::string str;
    typename T::iterator it;
    const typename T::iterator itlast = val.end()-1;
    for (it = val.begin(); it != val.end(); it++)
    {
        str += *it;
        if (it != itlast)
        {
            str += delim;
        }
    }
    return str;
}

std::string lstrip(const std::string &str, const std::string &delim="")
{
    std::string rawstr = str;
    std::string::iterator it;
    std::string sp = delim;
    const size_t spl = sp.length();

    if (0 == spl) {
        sp = " \t\n\v\f\r";
        // remove from head when startswith any of sp
        while (std::string::npos != sp.find(rawstr.at(0))) {
            rawstr.erase(0, 1);
        }
    } else {
        // remove from head when startswith sp
        while ((rawstr.length() >= spl)
                && (0 == rawstr.compare(0, spl, sp))) {
            print(rawstr);
            rawstr.erase(0, spl);
        }
    }
    return rawstr;
}

std::string rstrip(const std::string &str, const std::string &delim="")
{
    std::string rawstr = str;
    std::string::iterator it;
    std::string sp = delim;
    const size_t spl = sp.length();

    if (0 == spl) {
        sp = " \t\n\v\f\r";
        // remove from tail when endswith any of sp
        while (std::string::npos != sp.find(rawstr.at(rawstr.length()-1))) {
            rawstr.erase(rawstr.length()-1, 1);
        }
    } else {
        // remove from tail when endswith sp
        while ((rawstr.length() >= spl)
                && (0 == rawstr.compare((rawstr.length()-spl), spl, sp))) {
            rawstr.erase(rawstr.length()-spl, spl);
        }
    }
    return rawstr;
}

std::string strip(const std::string &str, const std::string &delim="")
{
    std::string rawstr = str;
    std::string::iterator it;
    std::string sp = delim;
    const size_t spl = sp.length();

    if (0 == spl) {
        sp = " \t\n\v\f\r";
        // remove from head when startswith any of sp
        while (std::string::npos != sp.find(rawstr.at(0))) {
            rawstr.erase(0, 1);
        }
        // remove from tail when endswith any of sp
        while (std::string::npos != sp.find(rawstr.at(rawstr.length()-1))) {
            rawstr.erase(rawstr.length()-1, 1);
        }
    } else {
        // remove from head when startswith sp
        while ((rawstr.length() >= spl)
                && (0 == rawstr.compare(0, spl, sp))) {
            rawstr.erase(0, spl);
        }
        // remove from tail when endswith sp
        while ((rawstr.length() >= spl)
                && (0 == rawstr.compare((rawstr.length()-spl), spl, sp))) {
            rawstr.erase(rawstr.length()-spl, spl);
        }
    }
    return rawstr;
}

bool startsWith(const std::string &src, const std::string &str)
{
    int srcpos = 0;
    int srclen = src.length();
    int sublen = str.length();
    if (srclen < sublen) {
        return false;
    }
    return (0 == src.compare(srcpos, sublen, str));
}

bool endsWith(const std::string &src, const std::string &str)
{
    int srcpos = 0;
    int srclen = src.length();
    int sublen = str.length();
    if (srclen < sublen) {
        return false;
    }
    srcpos = srclen - sublen;
    return (0 == src.compare(srcpos, sublen, str));
}

string mask(const string &src, int begin, int masklen)
{
    string ret = src;
    string mask = "";
    int length = (int)ret.length();
    int replen = 0;
    int pos = begin;
    if (begin < 0)
    {
        // mask from tail
        pos = length + begin;
    }
    if ((pos < 0) || (pos >= length))
    {
        // pos is out of range
        return ret;
    }
    if (masklen >= 0)
    {
        // std::min(masklen, (length-pos))
        replen = ((length - pos) > masklen) ? masklen : (length - pos);
    }
    else
    {
        // mask from tail
        // std::min((-masklen), (pos+1));
        replen = ((pos + 1) > -masklen) ? -masklen : (pos + 1);
        pos = (pos + 1) - replen;
    }

    if ((pos >= 0) && (pos < length))
    {
        // cout << "true" << endl;
        mask.assign(replen, '*');
        ret = ret.replace(pos, replen, mask);
    }
    return ret;
}

int main() {
    string split_line(30, '#');
    cout << split_line << endl;

    string_construct();
    string_assign();
    string_clear();

    string_c_str();
    string_data();

    string_at();
    string_begin_end();

    string_append();
    string_erase();
    string_insert();
    string_replace();

    string_capacity();
    string_length();
    string_size();
    string_empty();

    string_compare();
    string_copy();
    string_find();
    string_substr();

    // extended function
    // join(str, delim);
    vector<string> vec(4, "good");
    print(join(vec, "/"));
    string jstr(6, '0');
    print(join(jstr, "-"));

    // split(str, delim);
    string str = "/usr/local/bin/python";
    vector<string> vt;
    (void)split(str, "/", vt);
    vector<string>::iterator it;
    for (it = vt.begin(); it != vt.end(); it++)
    {
        print(*it);
    }

    // strip(str, chars);
    str = "  0hello good 0  ";
    str = strip(str, "0 ");
    print(str);
    print(str.length());
    // strip(str);
    str = "\n\r\t  0hello good 0  ";
    print(str);
    std::string lstr = lstrip(str);
    print(lstr);
    print(lstr.length());
    std::string rstr = rstrip(str);
    print(rstr);
    print(rstr.length());

    // mask
    string test = "01234567890";
    print(test);
    print(mask(test, 1, 3));   //0***4567890
    print(mask(test, 0, 4));   //****4567890
    print(mask(test, -1, -3)); //01234567***

    // startsWith
    print(startsWith(test, "01234")); //1
    // endsWith
    print(endsWith(test, "7890")); //1
    cout << split_line << endl;
    return 0;
}

 

参考资料

https://blog.csdn.net/tengfei461807914/article/details/52203202
https://www.cnblogs.com/aminxu/p/4686320.html

http://www.cplusplus.com/reference/string/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值