[cpp] #include <conio.h>
#include <iostream>
#include <string>
using namespace std;
//1.構造函數
/*
string();
string( size_type length, char ch );
string( const char *str );
string( const char *str, size_type index );
string( string &str, size_type index, size_type length );
string( input_iterator start, input_iterator end );
字符串的構造函數創建一個新字符串,包括:
1.以length為長度的ch的拷貝(即length個ch)
2.以str為初值 (長度任意),
3.以index為索引開始的子串,長度為length,或者
4.以從start到end的元素為初值.
*/
void test0()
{
string str1(5,'c');
string str2("Now is the time...");
string str3(str2,5);
string str4(str2,1,4);
cout<<str1<<endl;//ccccc
cout<<str2<<endl;//Now is the time...
cout<<str3<<endl;//s the time...
cout<<str4<<endl;//ow i
}
//2.操作符
/*
1.用==, >, <, >=, <=, and !=比較字符串,compare()
2.用 + 或者 += 操作符連接兩個字符串
3.用[]獲取特定的字符-->at()
A.compare()
int compare( const basic_string &str );
int compare( const char *str );
int compare( size_type index, size_type length, const basic_string &str );
int compare( size_type index, size_type length, const basic_string &str, size_type index2,
size_type length2 );
int compare( size_type index, size_type length, const char *str, size_type length2 );
返回值 情況 :小於零 this < str ;零 this == str ;大於零 this > str
不同的函數:
1.比較自己和str,
2.比較自己的子串和str,子串以index索引開始,長度為length
3.比較自己的子串和str的子串,其中index2和length2引用str,index和length引用自己
4.比較自己的子串和str的子串,其中str的子串以索引0開始,長度為length2,自己的子串以index開始,長度為length
*/
void test1()
{
string str1("hello");
cout<<str1[1]<<" "<<str1.at(4)<<endl;//e o //注意下標不要出界,否則會崩潰
}
//添加文本 append();賦值assign()
/*
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 );
append() 函數可以完成以下工作:
1.在字符串的末尾添加str,
2.在字符串的末尾添加str的子串,子串以index索引開始,長度為len
3.在字符串的末尾添加str中的num個字符,
4.在字符串的末尾添加num個字符ch,
5.在字符串的末尾添加以迭代器start和end表示的字符序列.
B==》與append()完全相同。
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 );
*/
void test2()
{
string str1=("hello");
str1.append(" ");
char* ch="world";
str1.append(ch);
str1.append(3,'!');
string str2="ni hai hao ma?????";
str1.append(str2,0,str2.length()-4);
str1.append("veryGood!!!",5);
cout<<str1<<endl;//hello world!!!ni hai hao ma?veryG
string str4, str3 = "War and Peace";
str4.assign( str3, 4, 3 );
cout << str4 << endl;//and
}
//查找find(),find_first_of(), find_first_not_of(),find_last_of(),find_last_not_of(),rfind()
/*
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()函數:
1.返回str在字符串中第一次出現的位置(從index開始查找)。如果沒找到則返回string::npos,
2.返回str在字符串中第一次出現的位置(從index開始查找,長度為length)。如果沒找到就返回string::npos,
3.返回字符ch在字符串中第一次出現的位置(從index開始查找)。如果沒找到就返回string::npos
find_first_of()函數:
1.查找在字符串中第一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始,如果沒找到就返回string::npos
size_type find_first_of( const char *str, size_type index, size_type num );
2.查找在字符串中第一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始,最多搜索num個字符。如果沒找到就返回string::npos,
3.查找在字符串中第一個與ch匹配的字符,返回它的位置。搜索從index開始。
find_first_not_of()函數:
1.在字符串中查找第一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type find_first_not_of( const char *str, size_type index, size_type num );
2.在字符串中查找第一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始,最多查找num個字符。如果沒找到就返回string::nops
3.在字符串中查找第一個與ch不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
find_last_of()函數:
1.在字符串中查找最後一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type find_last_of( const char *str, size_type index, size_type num );
2.在字符串中查找最後一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始,最多搜索num個字符。如果沒找到就返回string::nops
3.在字符串中查找最後一個與ch匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
find_last_not_of()函數:
1.在字符串中查找最後一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type find_last_not_of( const char *str, size_type index, size_type num );
2.在字符串中查找最後一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始,最多查找num個字符如果沒找到就返回string::nops
3.在字符串中查找最後一個與ch不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type rfind( const basic_string &str, size_type index );
size_type rfind( const char *str, size_type index );
size_type rfind( const char *str, size_type index, size_type num );
size_type rfind( char ch, size_type index );
rfind()函數: (逆向查找)
1.返回最後一個與str中的某個字符匹配的字符,從index開始查找。如果沒找到就返回string::npos
2.返回最後一個與str中的某個字符匹配的字符,從index開始查找,最多查找num個字符。如果沒找到就返回string::npos
3.返回最後一個與ch匹配的字符,從index開始查找。如果沒找到就返回string::npos
*/
void test3()
{
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;
/* 例如,在下列代碼中第一次調用rfind()返回string::npos,因為目標詞語不在開始的8個字符中。然而,第二次調用返回9,因為目標詞語在開始的20個字符之中。 */
int loc2;
string s = "My cat's breath smells like cat food.";
loc2 = s.rfind( "breath", 8 );
cout << "The word breath is at index " << loc2 << endl;//-1
loc2 = s.rfind( "breath", 20 );
cout << "The word breath is at index " << loc2 << endl;//9
}
//插入(insert),替換(replace)
/*
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()函數的功能非常多:
1.在迭代器i表示的位置前面插入一個字符ch,
2.在字符串的位置index插入字符串str,
3.在字符串的位置index插入字符串str的子串(從index2開始,長num個字符),
4.在字符串的位置index插入字符串str的num個字符,
5.在字符串的位置index插入num個字符ch的拷貝,
6.在迭代器i表示的位置前面插入num個字符ch的拷貝,
7.在迭代器i表示的位置前面插入一段字符,從start開始,以end結束.
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()函數:
1.用str中的num個字符替換本字符串中的字符,從index開始
2.用str中的num2個字符(從index2開始)替換本字符串中的字符,從index1開始,最多num1個字符
3.用str中的num個字符(從index開始)替換本字符串中的字符
4.用str中的num2個字符(從index2開始)替換本字符串中的字符,從index1開始,num1個字符
5.用num2個ch字符替換本字符串中的字符,從index開始
6.用str中的字符替換本字符串中的字符,迭代器start和end指示范圍
7.用str中的num個字符替換本字符串中的內容,迭代器start和end指示范圍,
8.用num個ch字符替換本字符串中的內容,迭代器start和end指示范圍.
*/
void test4()
{
string s = "They say he carved it himself...from a BIGGER spoon";
string s2 = "find your Homer.";
s.replace( 32, s2.length(), s2 );
cout << s << endl; //They say he carved it himself...find your Homer.oon
}
//其他
/*
交換(swap) void swap( basic_string &str );//把str和本字符串交換
basic_string substr( size_type index, size_type num = npos );
substr()返回本字符串的一個子串,從index開始,長num個字符。如果沒有指定,將是默認值 string::npos。這樣,substr()函數將簡單的返回從index開始的剩余的字符串。
size_type size();//size()函數返回字符串中現在擁有的字符數。
size_type length();//length()函數返回字符串的長度. 這個數字應該和size()返回的數字相同.
void clear();//清空
bool empty();//如果字符串為空則empty()返回真(true),否則返回假(false).
const char *data();//data()函數返回指向自己的第一個字符的指針.
const char *c_str();//c_str()函數返回一個指向正規C字符串的指針, 內容與本字符串相同.
*/
void test5()
{
string first( "This comes first" );
string second( "And this is second" );
first.swap( second );
cout << first << endl;//And this is second
cout << second << endl;//This comes first
string s("What we have here is a failure to communicate");
string sub = s.substr(5);
cout << sub << endl;//we have here is a failure to communicate
cout<<"sub size:"<<sub.size()<<" len:"<<sub.length()<<endl;//40 40
sub.clear();//<==>sub="";
cout<<sub.empty()<<endl;//1
}
//C++11
//轉換成 int;float;double;long;long long;long double;unsigned long;unsigned long long;
//stoi(),stof(),stod(),stold(),stol(),stoll(),stoul(),stoull(),
void test6()
{
const char *str1 = " 42";
const char *str2 = "3.14159";
const char *str3 = "31337 with words";
std::cout << "std::stoi(\"" << str1 << "\") is " << std::stoi(str1) << '\n';//42
std::cout << "std::stoi(\"" << str2 << "\") is " << std::stoi(str2) << '\n';//3
std::cout << "std::stoi(\"" << str3 << "\") is " << std::stoi(str3) << '\n';//31337
std::cout << "std::stof(\"" << str1 << "\") is " << std::stof(str1,NULL) << '\n';//42
std::cout << "std::stof(\"" << str2 << "\") is " << std::stof(str2) << '\n';//3.14159
std::cout << "std::stof(\"" << str3 << "\") is " << std::stof(str3) << '\n';//31337
std::cout << "std::stod(\"" << str1 << "\") is " << std::stod(str1) << '\n';//42
std::cout << "std::stod(\"" << str2 << "\") is " << std::stod(str2,NULL) << '\n';//3.14159
std::cout << "std::stod(\"" << str3 << "\") is " << std::stod(str3) << '\n';//31337
std::cout << "std::stold(\"" << str1 << "\") is " << std::stold(str1) << '\n';//42
std::cout << "std::stold(\"" << str2 << "\") is " << std::stold(str2) << '\n';//3.14159
std::cout << "std::stold(\"" << str3 << "\") is " << std::stold(str3,NULL) << '\n';//31337
string s1 = "-8246821";//十進制(默認)
string s2 = "-0xffff"; //十六進制
string s3 = "-020"; //八進制
string s4 = "11111110";//是十進制,若要二進制則:stol(s4,NULL,2)
//long 就是 int的加長版,而不是float的加長版
cout<<"stol("<<s1<<"( ="<<stol(s1,NULL,0)<<" = "<<stol(s1,NULL,10)<<endl;//-8246821
cout<<"stol("<<s2<<"( ="<<stol(s2,NULL,0)<<" = "<<stol(s2,NULL,16)<<endl;//-65535 若是stoll(s2)則=0;會自動識別進制
cout<<"stol("<<s3<<"( ="<<stol(s3,NULL,0)<<" = "<<stol(s3,NULL,8)<<endl;//-16 若是stoll(s3)則=0 ;會自動識別進制
cout<<"stol("<<s4<<"( ="<<stol(s4,NULL,0)<<" || "<<stol(s4,NULL,2)<<endl;//11111110 || 254
cout<<"stoul("<<s1<<"( ="<<stoul(s1,NULL,0)<<" = "<<stoul(s1,NULL,10)<<endl;//返回一個正的10位的大數據
cout<<"stoul("<<s2<<"( ="<<stoul(s2,NULL,0)<<" = "<<stoul(s2,NULL,16)<<endl;//
cout<<"stoul("<<s3<<"( ="<<stoul(s3,NULL,0)<<" = "<<stoul(s3,NULL,8)<<endl;//
cout<<"stoul("<<s4<<"( ="<<stoul("10.32",NULL,0)<<" || "<<stoul(s4,NULL,2)<<endl;//10 || 254
cout<<"stoll("<<s1<<"( ="<<stoll(s1,NULL,0)<<endl;//-8246821
cout<<"stoll("<<s2<<"( ="<<stoll(s2,NULL,0)<<endl;//-65535 若是stoll(s2)則=0;會自動識別進制
cout<<"stoll("<<s3<<"( ="<<stoll(s3,NULL,0)<<endl;//-16 若是stoll(s3)則=0 ;會自動識別進制
cout<<"stoll("<<s4<<"( ="<<stoll(s4,NULL,0)<<endl;//11111110
cout<<"stoull("<<s1<<"( ="<<stoull(s1,NULL,0)<<endl;//如字符串是負數,則會返回一個正的20位的大數據
cout<<"stoull("<<s2<<"( ="<<stoull(s2,NULL,0)<<endl;//
cout<<"stoull("<<s3<<"( ="<<stoull(s3,NULL,0)<<endl;//
cout<<"stoull("<<stoull(s3,NULL,0)<<"( ="<<stoull(to_string(stoull(s3,NULL,0)),NULL,0)<<endl;//18446744073709551600
}
//C++11
//num to string/wstring :to_string(),to_wstring()
void test7()
{
long double f=3.1415926;
std::wstring wpi = L"pi is " + std::to_wstring(f);
wstring wperfect = std::to_wstring(_ULonglong(1+2+4+7+14)) + L" is a perfect number";
wcout << wpi << L'\n';//3.14159
wcout << wperfect << L'\n';//28
std::string pi = "pi is " + std::to_string(f);
string perfect = std::to_string(long long(1+2+4+7+14)) + " is a perfect number";
cout << pi << endl;//3.14159
cout << perfect << endl;//28
}
void Test(char h)
{
cout<<"press key===="<<h<<endl;
switch(h)
{
case '0': test0();break;
case '1': test1();break;
case '2': test2();break;
case '3': test3();break;
case '4': test4();break;
case '5': test5();break;
case '6': test6();break;
case '7': test7();break;
case 27:
case 'q':exit(0);break;
default:cout<<"default "<<h<<endl;break;
}
}
void main()
{
while(1)
{
Test(getch());
}
}
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
//1.構造函數
/*
string();
string( size_type length, char ch );
string( const char *str );
string( const char *str, size_type index );
string( string &str, size_type index, size_type length );
string( input_iterator start, input_iterator end );
字符串的構造函數創建一個新字符串,包括:
1.以length為長度的ch的拷貝(即length個ch)
2.以str為初值 (長度任意),
3.以index為索引開始的子串,長度為length,或者
4.以從start到end的元素為初值.
*/
void test0()
{
string str1(5,'c');
string str2("Now is the time...");
string str3(str2,5);
string str4(str2,1,4);
cout<<str1<<endl;//ccccc
cout<<str2<<endl;//Now is the time...
cout<<str3<<endl;//s the time...
cout<<str4<<endl;//ow i
}
//2.操作符
/*
1.用==, >, <, >=, <=, and !=比較字符串,compare()
2.用 + 或者 += 操作符連接兩個字符串
3.用[]獲取特定的字符-->at()
A.compare()
int compare( const basic_string &str );
int compare( const char *str );
int compare( size_type index, size_type length, const basic_string &str );
int compare( size_type index, size_type length, const basic_string &str, size_type index2,
size_type length2 );
int compare( size_type index, size_type length, const char *str, size_type length2 );
返回值 情況 :小於零 this < str ;零 this == str ;大於零 this > str
不同的函數:
1.比較自己和str,
2.比較自己的子串和str,子串以index索引開始,長度為length
3.比較自己的子串和str的子串,其中index2和length2引用str,index和length引用自己
4.比較自己的子串和str的子串,其中str的子串以索引0開始,長度為length2,自己的子串以index開始,長度為length
*/
void test1()
{
string str1("hello");
cout<<str1[1]<<" "<<str1.at(4)<<endl;//e o //注意下標不要出界,否則會崩潰
}
//添加文本 append();賦值assign()
/*
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 );
append() 函數可以完成以下工作:
1.在字符串的末尾添加str,
2.在字符串的末尾添加str的子串,子串以index索引開始,長度為len
3.在字符串的末尾添加str中的num個字符,
4.在字符串的末尾添加num個字符ch,
5.在字符串的末尾添加以迭代器start和end表示的字符序列.
B==》與append()完全相同。
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 );
*/
void test2()
{
string str1=("hello");
str1.append(" ");
char* ch="world";
str1.append(ch);
str1.append(3,'!');
string str2="ni hai hao ma?????";
str1.append(str2,0,str2.length()-4);
str1.append("veryGood!!!",5);
cout<<str1<<endl;//hello world!!!ni hai hao ma?veryG
string str4, str3 = "War and Peace";
str4.assign( str3, 4, 3 );
cout << str4 << endl;//and
}
//查找find(),find_first_of(), find_first_not_of(),find_last_of(),find_last_not_of(),rfind()
/*
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()函數:
1.返回str在字符串中第一次出現的位置(從index開始查找)。如果沒找到則返回string::npos,
2.返回str在字符串中第一次出現的位置(從index開始查找,長度為length)。如果沒找到就返回string::npos,
3.返回字符ch在字符串中第一次出現的位置(從index開始查找)。如果沒找到就返回string::npos
find_first_of()函數:
1.查找在字符串中第一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始,如果沒找到就返回string::npos
size_type find_first_of( const char *str, size_type index, size_type num );
2.查找在字符串中第一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始,最多搜索num個字符。如果沒找到就返回string::npos,
3.查找在字符串中第一個與ch匹配的字符,返回它的位置。搜索從index開始。
find_first_not_of()函數:
1.在字符串中查找第一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type find_first_not_of( const char *str, size_type index, size_type num );
2.在字符串中查找第一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始,最多查找num個字符。如果沒找到就返回string::nops
3.在字符串中查找第一個與ch不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
find_last_of()函數:
1.在字符串中查找最後一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type find_last_of( const char *str, size_type index, size_type num );
2.在字符串中查找最後一個與str中的某個字符匹配的字符,返回它的位置。搜索從index開始,最多搜索num個字符。如果沒找到就返回string::nops
3.在字符串中查找最後一個與ch匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
find_last_not_of()函數:
1.在字符串中查找最後一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type find_last_not_of( const char *str, size_type index, size_type num );
2.在字符串中查找最後一個與str中的字符都不匹配的字符,返回它的位置。搜索從index開始,最多查找num個字符如果沒找到就返回string::nops
3.在字符串中查找最後一個與ch不匹配的字符,返回它的位置。搜索從index開始。如果沒找到就返回string::nops
size_type rfind( const basic_string &str, size_type index );
size_type rfind( const char *str, size_type index );
size_type rfind( const char *str, size_type index, size_type num );
size_type rfind( char ch, size_type index );
rfind()函數: (逆向查找)
1.返回最後一個與str中的某個字符匹配的字符,從index開始查找。如果沒找到就返回string::npos
2.返回最後一個與str中的某個字符匹配的字符,從index開始查找,最多查找num個字符。如果沒找到就返回string::npos
3.返回最後一個與ch匹配的字符,從index開始查找。如果沒找到就返回string::npos
*/
void test3()
{
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;
/* 例如,在下列代碼中第一次調用rfind()返回string::npos,因為目標詞語不在開始的8個字符中。然而,第二次調用返回9,因為目標詞語在開始的20個字符之中。 */
int loc2;
string s = "My cat's breath smells like cat food.";
loc2 = s.rfind( "breath", 8 );
cout << "The word breath is at index " << loc2 << endl;//-1
loc2 = s.rfind( "breath", 20 );
cout << "The word breath is at index " << loc2 << endl;//9
}
//插入(insert),替換(replace)
/*
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()函數的功能非常多:
1.在迭代器i表示的位置前面插入一個字符ch,
2.在字符串的位置index插入字符串str,
3.在字符串的位置index插入字符串str的子串(從index2開始,長num個字符),
4.在字符串的位置index插入字符串str的num個字符,
5.在字符串的位置index插入num個字符ch的拷貝,
6.在迭代器i表示的位置前面插入num個字符ch的拷貝,
7.在迭代器i表示的位置前面插入一段字符,從start開始,以end結束.
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()函數:
1.用str中的num個字符替換本字符串中的字符,從index開始
2.用str中的num2個字符(從index2開始)替換本字符串中的字符,從index1開始,最多num1個字符
3.用str中的num個字符(從index開始)替換本字符串中的字符
4.用str中的num2個字符(從index2開始)替換本字符串中的字符,從index1開始,num1個字符
5.用num2個ch字符替換本字符串中的字符,從index開始
6.用str中的字符替換本字符串中的字符,迭代器start和end指示范圍
7.用str中的num個字符替換本字符串中的內容,迭代器start和end指示范圍,
8.用num個ch字符替換本字符串中的內容,迭代器start和end指示范圍.
*/
void test4()
{
string s = "They say he carved it himself...from a BIGGER spoon";
string s2 = "find your Homer.";
s.replace( 32, s2.length(), s2 );
cout << s << endl; //They say he carved it himself...find your Homer.oon
}
//其他
/*
交換(swap) void swap( basic_string &str );//把str和本字符串交換
basic_string substr( size_type index, size_type num = npos );
substr()返回本字符串的一個子串,從index開始,長num個字符。如果沒有指定,將是默認值 string::npos。這樣,substr()函數將簡單的返回從index開始的剩余的字符串。
size_type size();//size()函數返回字符串中現在擁有的字符數。
size_type length();//length()函數返回字符串的長度. 這個數字應該和size()返回的數字相同.
void clear();//清空
bool empty();//如果字符串為空則empty()返回真(true),否則返回假(false).
const char *data();//data()函數返回指向自己的第一個字符的指針.
const char *c_str();//c_str()函數返回一個指向正規C字符串的指針, 內容與本字符串相同.
*/
void test5()
{
string first( "This comes first" );
string second( "And this is second" );
first.swap( second );
cout << first << endl;//And this is second
cout << second << endl;//This comes first
string s("What we have here is a failure to communicate");
string sub = s.substr(5);
cout << sub << endl;//we have here is a failure to communicate
cout<<"sub size:"<<sub.size()<<" len:"<<sub.length()<<endl;//40 40
sub.clear();//<==>sub="";
cout<<sub.empty()<<endl;//1
}
//C++11
//轉換成 int;float;double;long;long long;long double;unsigned long;unsigned long long;
//stoi(),stof(),stod(),stold(),stol(),stoll(),stoul(),stoull(),
void test6()
{
const char *str1 = " 42";
const char *str2 = "3.14159";
const char *str3 = "31337 with words";
std::cout << "std::stoi(\"" << str1 << "\") is " << std::stoi(str1) << '\n';//42
std::cout << "std::stoi(\"" << str2 << "\") is " << std::stoi(str2) << '\n';//3
std::cout << "std::stoi(\"" << str3 << "\") is " << std::stoi(str3) << '\n';//31337
std::cout << "std::stof(\"" << str1 << "\") is " << std::stof(str1,NULL) << '\n';//42
std::cout << "std::stof(\"" << str2 << "\") is " << std::stof(str2) << '\n';//3.14159
std::cout << "std::stof(\"" << str3 << "\") is " << std::stof(str3) << '\n';//31337
std::cout << "std::stod(\"" << str1 << "\") is " << std::stod(str1) << '\n';//42
std::cout << "std::stod(\"" << str2 << "\") is " << std::stod(str2,NULL) << '\n';//3.14159
std::cout << "std::stod(\"" << str3 << "\") is " << std::stod(str3) << '\n';//31337
std::cout << "std::stold(\"" << str1 << "\") is " << std::stold(str1) << '\n';//42
std::cout << "std::stold(\"" << str2 << "\") is " << std::stold(str2) << '\n';//3.14159
std::cout << "std::stold(\"" << str3 << "\") is " << std::stold(str3,NULL) << '\n';//31337
string s1 = "-8246821";//十進制(默認)
string s2 = "-0xffff"; //十六進制
string s3 = "-020"; //八進制
string s4 = "11111110";//是十進制,若要二進制則:stol(s4,NULL,2)
//long 就是 int的加長版,而不是float的加長版
cout<<"stol("<<s1<<"( ="<<stol(s1,NULL,0)<<" = "<<stol(s1,NULL,10)<<endl;//-8246821
cout<<"stol("<<s2<<"( ="<<stol(s2,NULL,0)<<" = "<<stol(s2,NULL,16)<<endl;//-65535 若是stoll(s2)則=0;會自動識別進制
cout<<"stol("<<s3<<"( ="<<stol(s3,NULL,0)<<" = "<<stol(s3,NULL,8)<<endl;//-16 若是stoll(s3)則=0 ;會自動識別進制
cout<<"stol("<<s4<<"( ="<<stol(s4,NULL,0)<<" || "<<stol(s4,NULL,2)<<endl;//11111110 || 254
cout<<"stoul("<<s1<<"( ="<<stoul(s1,NULL,0)<<" = "<<stoul(s1,NULL,10)<<endl;//返回一個正的10位的大數據
cout<<"stoul("<<s2<<"( ="<<stoul(s2,NULL,0)<<" = "<<stoul(s2,NULL,16)<<endl;//
cout<<"stoul("<<s3<<"( ="<<stoul(s3,NULL,0)<<" = "<<stoul(s3,NULL,8)<<endl;//
cout<<"stoul("<<s4<<"( ="<<stoul("10.32",NULL,0)<<" || "<<stoul(s4,NULL,2)<<endl;//10 || 254
cout<<"stoll("<<s1<<"( ="<<stoll(s1,NULL,0)<<endl;//-8246821
cout<<"stoll("<<s2<<"( ="<<stoll(s2,NULL,0)<<endl;//-65535 若是stoll(s2)則=0;會自動識別進制
cout<<"stoll("<<s3<<"( ="<<stoll(s3,NULL,0)<<endl;//-16 若是stoll(s3)則=0 ;會自動識別進制
cout<<"stoll("<<s4<<"( ="<<stoll(s4,NULL,0)<<endl;//11111110
cout<<"stoull("<<s1<<"( ="<<stoull(s1,NULL,0)<<endl;//如字符串是負數,則會返回一個正的20位的大數據
cout<<"stoull("<<s2<<"( ="<<stoull(s2,NULL,0)<<endl;//
cout<<"stoull("<<s3<<"( ="<<stoull(s3,NULL,0)<<endl;//
cout<<"stoull("<<stoull(s3,NULL,0)<<"( ="<<stoull(to_string(stoull(s3,NULL,0)),NULL,0)<<endl;//18446744073709551600
}
//C++11
//num to string/wstring :to_string(),to_wstring()
void test7()
{
long double f=3.1415926;
std::wstring wpi = L"pi is " + std::to_wstring(f);
wstring wperfect = std::to_wstring(_ULonglong(1+2+4+7+14)) + L" is a perfect number";
wcout << wpi << L'\n';//3.14159
wcout << wperfect << L'\n';//28
std::string pi = "pi is " + std::to_string(f);
string perfect = std::to_string(long long(1+2+4+7+14)) + " is a perfect number";
cout << pi << endl;//3.14159
cout << perfect << endl;//28
}
void Test(char h)
{
cout<<"press key===="<<h<<endl;
switch(h)
{
case '0': test0();break;
case '1': test1();break;
case '2': test2();break;
case '3': test3();break;
case '4': test4();break;
case '5': test5();break;
case '6': test6();break;
case '7': test7();break;
case 27:
case 'q':exit(0);break;
default:cout<<"default "<<h<<endl;break;
}
}
void main()
{
while(1)
{
Test(getch());
}
} 總結
字符串string的操作無非就是:與別串操作;字串查詢;自身操作;
A.自身屬性:字符串長度
B.與別的字符串進行操作(string1 與 string2 之間的關系):
1.比較大小
2.附加,交換
3.在string1的某個位置上插入string2的字串
4.string1的某些字符(用位置(index)個數(num)來確定)被string2的某些字符替換
5.拷貝字串給另一個字符串
C.查找字串:
1.從某個位置開始查詢字串第一次或最後一次出現的位置
2.在string1的某個字串中,查詢字串第一次或最後一次出現的位置
3.從某個位置開始查詢,某個字符第一次或最後一次出現的位置
D.與自身操作: 1.清空; 2.獲取或刪除某個位置上的字符; 3.獲取某個位置上的字串
E.與其他類型之間的轉換:
1.字符串通過地址,atoi(),atof,atol()來轉換成數值
2.C++11:std::stoi(),stof(),stod(),stold(),stol(),stoll(),stoul(),stoull()
3.數值轉換成string或寬字符串wstring:std::to_string(),std::to_wstring()