C++ String 輸入帶空格的字符串
string s;
getline(cin,s);
#include<iostream>
#include <string>
#include <stdexcept>
using namespace std;
/*
string 構造函數:
string();//創建一個空的字符串 例如: string str;
string(const string& str);//使用一個string對象初始化另一個string對象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n個字符c初始化
string基本賦值操作:
string& operator=(const char* s);//char*類型字符串 賦值給當前的字符串
string& operator=(const string &s);//把字符串s賦給當前的字符串
string& operator=(char c);//字符賦值給當前的字符串
string& assign(const char *s);//把字符串s賦給當前的字符串
string& assign(const char *s, int n);//把字符串s的前n個字符賦給當前的字符串
string& assign(const string &s);//把字符串s賦給當前字符串
string& assign(int n, char c);//用n個字符c賦給當前字符串
string& assign(const string &s, int start, int n);//將s從start開始n個字符賦值給字符串
*/
void test01()
{
string str; //默認構造
string str2(str); //拷貝構造
string str3 = str;
string str4 = "abcd";
string str5(10, 'a');
cout << str4 << endl;
cout << str5 << endl;
//基本賦值
str = "hello";
str2 = str4;
//string& assign(const char *s, int n);//把字符串s的前n個字符賦給當前的字符串
str3.assign("abcdef", 4);
cout << str3 << endl;
//string& assign(const string &s, int start, int n);//將s從start開始n個字符賦值給字符串
string str6;
str6.assign(str, 1, 3); //ell ? hel 從0索引
cout << str6 << endl;
}
/*
string存取字符操作
char& operator[](int n);//通過[]方式取字符
char& at(int n);//通過at方法獲取字符
*/
void test02()
{
string s = "hello world";
for (int i = 0; i < s.size();i++)
{
//cout << s[i] << endl;
cout << s.at(i) << endl;
}
//[] 和at區別?[]訪問越界 直接掛掉 at會拋出異常
try
{
//cout << s[100] << endl;
cout << s.at(100) << endl;
}
catch (out_of_range & e)
{
cout << e.what() << endl;
}
catch (...)
{
cout << "越界異常" << endl;
}
}
/*
string拼接操作:
string& operator+=(const string& str);//重載+=操作符
string& operator+=(const char* str);//重載+=操作符
string& operator+=(const char c);//重載+=操作符
string& append(const char *s);//把字符串s連接到當前字符串結尾
string& append(const char *s, int n);//把字符串s的前n個字符連接到當前字符串結尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中從pos開始的n個字符連接到當前字符串結尾
string& append(int n, char c);//在當前字符串結尾添加n個字符c
string查找和替換:
int find(const string& str, int pos = 0) const; //查找str第一次出現位置,從pos開始查找
int find(const char* s, int pos = 0) const; //查找s第一次出現位置,從pos開始查找
int find(const char* s, int pos, int n) const; //從pos位置查找s的前n個字符第一次位置
int find(const char c, int pos = 0) const; //查找字符c第一次出現位置
int rfind(const string& str, int pos = npos) const;//查找str最後一次位置,從pos開始查找
int rfind(const char* s, int pos = npos) const;//查找s最後一次出現位置,從pos開始查找
int rfind(const char* s, int pos, int n) const;//從pos查找s的前n個字符最後一次位置
int rfind(const char c, int pos = 0) const; //查找字符c最後一次出現位置
string& replace(int pos, int n, const string& str); //替換從pos開始n個字符爲字符串str
string& replace(int pos, int n, const char* s); //替換從pos開始的n個字符爲字符串s
*/
void test03()
{
//拼接
string s1 = "我";
string s2 = "愛北京";
s1 += s2;
cout << s1 << endl;
s1.append("天安門");
cout << s1 << endl;
//find查找
string s = "abcdefg";
int pos = s.find("bcf"); //找不到返回是 -1
cout << "pos = " << pos << endl;
int pos2 = s.rfind("bc"); //rfind 和find 結果一樣,內部查找順序相反
cout << "pos2 = " << pos2 << endl; // 4 2
//替換
string s3 = "hello"; //替換從pos開始n個字符爲字符串str
s3.replace(1, 3, "1111");
cout << s3 << endl; // h1111o
}
/*
string比較操作:
compare函數在>時返回 1,<時返回 -1,==時返回 0。
比較區分大小寫,比較時參考字典順序,排越前面的越小。
大寫的A比小寫的a小。
int compare(const string &s) const;//與字符串s比較
int compare(const char *s) const;//與字符串s比較
*/
void test04()
{
string s1 = "abc";
string s2 = "abcd";
if (s1.compare(s2) == 0)
{
cout << "s1 等於 s2" << endl;
}
else if (s1.compare(s2) == 1)
{
cout << "s1 大於 s2" << endl;
}
else
{
cout << "s1 小於 s2" << endl;
}
}
/*
string子串:
string substr(int pos = 0, int n = npos) const;//返回由pos開始的n個字符組成的字符串
*/
void test05()
{
string s1 = "abcde";
string s2 = s1.substr(1, 3);
cout << "s2 = " << s2 << endl;
//需求 查找一個右鍵的 用戶名
string email = "[email protected]";
int pos = email.find("@");//8
cout << "pos " << pos << endl;
string usrName = email.substr(0, pos);
cout << "用戶名爲:" << usrName << endl;
}
/*
string插入和刪除操作:
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n個字符c
string& erase(int pos, int n = npos);//刪除從Pos開始的n個字符
*/
void test06()
{
string s1 = "hello";
s1.insert(1, "111");
cout << s1 << endl; //h111ello
//刪除 111
s1.erase(1, 3);
cout << s1 << endl;
}
/*
string和c-style字符串轉換
*/
void func(string s)
{
cout << s << endl;
}
void func2(const char * s)
{
cout << s << endl;
}
void test07()
{
string s = "abc";
//string -> const char *
const char * p = s.c_str();
func(p); //const char * 隱式類型轉換爲 string
//const char * -> string
string s2(p);
//func2(s2); //string 不能隱式類型轉換爲 char *
}
void test08()
{
string s = "abcdefg";
char& a = s[2];
char& b = s[3];
a = '1';
b = '2';
cout << s << endl;
cout << (int*)s.c_str() << endl;
s = "pppppppppppppp";
//a = '1';
//b = '2';
cout << s << endl;
cout << (int*)s.c_str() << endl;
}
/*
寫一個函數,函數內部將string字符串中的所有小寫字母都變爲大寫字母。
*/
void test09()
{
string s = "abCdEfg";
for (int i = 0; i < s.size();i++)
{
//s[i] = toupper(s[i]);
//全變小寫
s[i] = tolower(s[i]);
}
cout << s << endl;
}
int main()
{
//test01();
//test02();
//test03();
//test04();
//test05();
//test06();
//test07();
//test08();
test09();
return 0;
}