IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> string容器——STL -> 正文阅读

[C++知识库]string容器——STL

string容器



构造函数(创建string)

string(const string& str);//1
string(const char*s);//2
string(int n,char c);//3

int main()
{
    string str;
    string str2(str);//1
    string str3 = "abc";//2
    string str4(10,'a');//3  10个字符a
}


赋值(’=’ 和 assign())

有两种方式,一种就是通过**=**来赋值,另一种就是通过assign()来赋值。

 void test01()
{
	string str;
	str = "abc";//abc
	str.assign("abc");//abc
	str.assign("abc", 1);//a
	string str2;
	str2.assign(str);//a
	str2.assign(5, 'a');//aaaaa
	str2.assign("abc", 0, 2);//ab  从0号位置开始去,拿走两个
	//cout << str << endl;
	cout << str2 << endl;
}

int main()
{
	test01();
    return 0;
}


存取([ ] 和 at( ))
string str = "abcd";
//如何获得字符串长度进而打印字符串呢?是不能使用strlen()的,这个函数的参数是char*而不是string。
//string中专门维护着求字符串长度的方法
int length = str.size()
int main()
{
    string str = "abcde";
    int length = str.size();
    cout << length << endl;
    for (int i = 0; i < length; i++)
    {
        cout << str[i] << " ";//用中括号
        cout << str.at(i) << " ";//用at()函数
    }
    return 0;
}

用两种方法都可以索引到相应的数据

区别:如果使用[ ]不小心越界,那么会直接挂掉;如果使用at(),不会直接挂掉,而是抛出一个异常(out_of_range).

如果使用中括号,如果出错,使用try,catch也不会捕获到异常,而是直接挂掉。

int main()
{
    string str = "12345";
    try
    {
        cout << str.at(100) << endl;
    }
    catch (out_of_range e)
    {
        cout << e.what() << endl;//系统打印的结果invalid string position
    }
    /*
    catch(...)
    {
        cout<<"捕获到了异常"<<endl;
    }
    */
    return 0;
}


拼接(+= 和 append())
int main()
{
    string str1 = "I LOVE ";
    string str2 = "YOU";

    //str1 += str2;
    str1.append(str2);
    
    return 0;
}


查找(find())
int main()
{
	string str = "abcdefg";
	cout << str.find("de") << endl;//返回的是首字符的数组下标
	
	return 0;
}
int main()
{
	string str = "abcdefg";
	int pos = str.find("cd");
	if (pos == -1)//一般都有判断语句
	{
		cout << "没有找到" << endl;
	}
	else
	{
		cout << "下标位置是:" << pos << endl;
	}
	return 0;
}

如果是rfind(),就是从右往左找到符合的字符,然后再输出其下标(下标是不变的)。正常情况下rfind和find的用法是一样的 ,但是如果有同样满足的字符的时候,距离左边近的就用find,距离右边近的就用rfind。

int pos = str.find('@',1);
//从下标为1的地方开始寻找@,这个用的比较多。


替换(replace())
int main()
{
	string str = "abcdefgc";
	str.replace(1, 3, "1111");//替换从1开始的3个字符为"1111";
	cout << str << endl;
	return 0;
}


比较(compare())
int main()
{
	string str = "abcd";
	string str2 = "abcd";
	if (str.compare(str2) == 0)
	{
		cout << "字符串相等" << endl;
	}
	else if (str.compare(str2) > 0)
	{
		cout << "str字符串比较大" << endl;
	}
	else if (str.compare(str2) < 0)
	{
		cout << "str2字符串比较大" << endl;
	}
	
	return 0;
}


字串(substr)
int main()
{
	string str = "abcd";
	string str2 = str.substr(0, 3);//返回由下标0开始的3个字符组成的字符串
	return 0;
}

来个小例题:从电子邮件中将用户名截出来。(zhangsan@outlookcom 中截出zhangsan)

int main()
{
	string str = "zhangsan@outlookcom";
	int pos = str.find('@');
	string substr = str.substr(0, pos);
	cout << substr << endl;
	return 0;
}


上面内容总结:解析字符串

例题:将字符串ww.baidu.com.cn中的单词ww baidu com cn截取到vector容器中。

int main()
{
	string str = "ww.baidu.com.cn";
	vector<string> v;

	int start = 0;

	int pos = -1;

	while (true)
	{
		pos = str.find('.',start);
		if (pos == -1)
		{
			string substr2 = str.substr(start, str.size() - start);
			v.push_back(substr2);
			break;
		}
		string substr1 = str.substr(start, pos-start);
		start = pos + 1;
		v.push_back(substr1);
	}

	for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << endl;
	}
	
	return 0;
}


插入和删除操作(insert(),erase())

string& insert(int pos,const char* s);在指定位置插入字符串

string& insert(int pos,const char* s);在指定位置插入字符串

string& insert(int pos,int n, char c);在指定位置插入n个c字符

string& erase(int pos,int n );从指定位置开始删除n个字符

int main()
{
	string str = "hello";
	str.insert(1, "111");//在指定的下标位置前插入字符串:h111ello

	str.erase(1, 3);//删除从下标位置开始的3个字符(包括下标位置):hello

	return 0;
}


string和c-style字符串转换
int main()
{
	const char* str = "abcd";
	//将const chat* 转为 string
	string s(str);//有参构造
	cout << s << endl;
	return 0;
}
int main()
{
	string str = "hello";
	//将string 转为 const char*
	const char* str2 = str.c_str();
	return 0;
}

参数类型的转换

void func(string s)
{
}

int main()
{
    const char* str = "hello";
    func(str);
    return 0;
}
//以上写法是没有错的,const char*可以隐式转换为string
void func2(const char * s)
{
}
int main()
{
    string str 	= "hello";;
    func2(str);
    return 0;
}
//以上的写法就会报错。string不能隐式类型转换为const char*

string类中是维护着已给const char*的。某种意义上,string>const char *



小写变大写(toupper() / tolower())

就是将所有的字符都变成大写。

需要使用toupper()函数

int main()
{
	string str = "abcDeF";
	for (int i = 0; i < str.size(); i++)
	{
		str[i] = toupper(str[i]);
        //如果是大写变小写:str[i] = tolower();
    }
	cout << str << endl;
	return 0;
}

如果是大写变小写,需要使用tolower()函数




小提示

如果想修改string字符串的内容,那么如果使用[ ]和 at( )返回字符的引用(准备用引用修改值),然后才能修改。但是如果当字符串的内存被重新分配了以后,可能会发生错误。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:18:35  更:2022-03-24 00:19:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:09:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码