目录
string类的常用接口说明
string类对象的修改操作(修饰符)
operator+= & append & push_back
assign & insert
erase & replace
swap & pop_back
string类对象的非成员函数
operator+
relational operators(关系运算符)
getline
to_string & stoi
取域名使用实践
string类的常用接口说明
注:需要详细了解各接口使用方法,请访问网站:cplusplus.com - The C++ Resources Network
string类对象的修改操作(修饰符)
operator+= & append & push_back
void test_string19()
{
string s1("hello world");
cout << s1 << endl;
// 尾插一个x
s1.push_back('x');
cout << s1 << endl;
// 输出 hello worldx
//在字符串后追加一个字符串
s1.append(" yyyyyy!!");
cout << s1 << endl;
// 输出 hello worldx yyyyyy!!
string s2("111111");
//在字符串后追加字符串str
s1 += 'y';
s1 += "zzzzzzzz";
s1 += s2;
cout << s1 << endl;
// 输出 hello worldx yyyyyy!!yzzzzzzzz111111
}
在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
assign & insert
void test_string20()
{
string s1("hello world");
cout << s1 << endl;
//为字符串分配一个新值,替换其当前内容
s1.assign("111111");
cout << s1 << endl;
// 输出111111
// 慎用,效率不高 -> O(N)
// 实践中需求也不高
string s2("hello world");
s2.insert(0, "xxxx");
cout << s2 << endl;
// 输出 xxxxhello world
char ch = 'y';
cin >> ch;// 输入 kvl
s2.insert(0, 1, ch);
cout << s2 << endl;
// 输出 kxxxxhello world
s2.insert(s2.begin(), 'y');
cout << s2 << endl;
// 输出 ykxxxxhello world
s2.insert(s2.begin(), s1.begin(), s1.end());
cout << s2 << endl;
// 输出 111111ykxxxxhello world
}
erase & replace
void test_string21()
{
string s1("hello world");
cout << s1 << endl;
// erase效率不高,慎用,和insert类似,要挪动数据
s1.erase(0, 1);
cout << s1 << endl;
// 输出 ello world
//s1.erase(5); //和下面效果类似 默认从下标5位置开始删完
s1.erase(5, 100);
cout << s1 << endl;
// 输出 ello
// replace效率不高,慎用,和insert类似,要挪动数据
string s2("hello world");
s2.replace(5, 1, "%20");
cout << s2 << endl;
// 输出 hello % 20world
}
swap & pop_back
void test_string22()
{
string a = "money";
string b = "goods";
cout << a <<' '<< b << endl;
a.swap(b);
a.pop_back(); // 尾删一个字符
cout << a <<' '<< b << endl;
}
string类对象的非成员函数
operator+
为了处理this指针只能在函数参数第一个位置的情况,C++将operator+设置为全局函数,就是应对一下情况:
void test_string23()
{
string s1 = "hello";
string s2 = "hello11";
string ret1 = s1 + s2;
cout << ret1 << endl;
string ret2 = s1 + "xxxxx";
cout << ret2 << endl;
//特殊情况,this指针在第二个位置
string ret3 = "xxxxx" + s1;
cout << ret3 << endl;
}
relational operators(关系运算符)
void test_string23()
{
string s1 = "hello";
string s2 = "hello11";
// 字典序比较
cout << (s1 < s2) << endl;
}
按照ascii码比较即可,一位一位依次比较。
getline
从输入中提取整行字符,直到找到分隔符 dim或换行符 '\n'为止
void test_string24()
{
// 默认规定空格或者换行是多个值之间分割
string str;
//cin >> str;
getline(cin, str);
//类似gets
cout << str << endl;
}
to_string & stoi
int main()
{
// atoi 字符转整形
// itoa 整形转字符
// stoi string转整形
// to_string 整形转string
int x = 0, y = 0;
cin >> x>>y;
string str = to_string(x + y);
cout << str << endl;
int z = stoi(str);
return 0;
}
注意,字符串转整型最多只能转42亿一下的(unsigne int)平常不建议使用string转整形。
取域名使用实践
void test_string26()
{
string file("string.cpp.zip");
//从后往前找第一个出现.的地方
size_t pos = file.rfind('.');
//string suffix = file.substr(pos, file.size() - pos);
string suffix = file.substr(pos);
//从.开始取到字符串结束
cout << suffix << endl;// .zip
string url("https://gitee.com/TestString.cpp");
//从前往后找第一个出现:的地方
size_t pos1 = url.find(':');
//substr区间为左闭右开,取不到:
string url1 = url.substr(0, pos1 - 0);
cout << url1 << endl;// http
size_t pos2 = url.find('/', pos1 + 3);//跳过://找第一个出现/的位置
string url2 = url.substr(pos1 + 3, pos2 - (pos1 + 3));
cout << url2 << endl;// gitee.com
string url3 = url.substr(pos2 + 1);
cout << url3 << endl;// TestString.cpp
}
通过灵活运用上面的接口,可以实现取网址端口和域名的功能,下期讲解常用端口的底层实现。