c++ string字符串详解_c++字符串-程序员宅基地

技术标签: c++ 入门大全  c++  c语言  string字符串  

string字符串

string本质上可以看做是一种vector< char >,也就是元素为char的vector。所以有关 vector的基本操作都可以在string上进行。


string的创建和初始化

string与 vector 类似,也有好几种初始化方法。(通过例子了解一下)

string的初始化

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

//string的初始化

int main()
{
    
	string s1;
	string s2 (3,'a');
	string s3 ("value");
	string s4 (s3);
	cout << "s1:" << s1 << endl;
	cout << "s2: " << s2 << endl;
	cout << "s3: " << s3 << endl;
	cout << "s4: " << s4 << endl;
	return 0 ;
}

运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/826542e6cb6e405582aec63ab4b94c7d
例子展示了几种不同的string初始化方法。由于字符串支持输出操作符“<<”,因此可以直接打印。

第一种和最后一种初始化方法都与 vector类似,分别是空字符串和利用复制初始化字符串,第二种方法也与 vector< char >类似,而第三种方法则是用字符串字面量来初始化string字符串。需要注意的是,在使用字符串的时候我们需要包含标准库的< string >头文件。


string的读写

利用cout可以打印string,即将string输出到标准输出端,也就是命令行窗口。类似的,c++也提供了一种方法从标准输入端,也就是键盘将数据写入string。

string的读写

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

//string的读写

int main()
{
    
	string s1;
	string s2;
	cout << "请输入用两个空格隔开的字符串!" << endl;
	cin >> s1 >> s2;
	cout << "s1: " << s1 << endl;
	cout << "s2: " << s2 << endl;
	return 0 ;
}


运行结果:
在这里插入图片描述
实际操作工程中,用户往往不知道程序期望自己输入几个字符串,这时候我们可以利用输入操作符“>>”的特性接受不确定个数的输入。

string的循环读取

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

//string的循环读取

int main()
{
    
	vector<string> strVec;
	string s;
	while (cin >> s)
	{
    
		strVec.push_back(s);
		for ( int i = 0; i < strVec.size() ;i++ )
	{
    
		cout << strVec[i] << " " ;
	}
		cout << endl;
	}
	return 0;
}

运行结果:
在这里插入图片描述
从例子中可以看到,输入操作cin >> s 的表达式返回值可以反映出当前是否还有输入。由于标准输入是键盘输入,没有结尾的标志,因此这个循环会一直继续下去。如果是文件输入,到了文件尾没有字符串了就会跳出循环。
例子中,在运行时依次输入了6个字符串,程序每次会反馈并输出当前媳妇穿vector中所有字符串。


string的基本操作

vector的操作都适用于string,接下来简单介绍一下这些基本操作。

string的基本操作

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

//string的基本操作

int main()
{
    
	string s;
	if (s.empty() ) cout << "字符串是空的" <<endl;
	cout << "添加两个字符" <<endl;
	s.push_back('a');
	s.push_back('b');
	if (s.empty() ) cout << "字符串是空的" <<endl;
	cout << "字符串有:" << s.length() << "个字符" << endl;
	cout << "打印字符串: " << s <<endl;
	cout << "移除一个字符!" << endl;
	s.pop_back();
	if (s.empty() ) cout <<"字符串是空的!" << endl;
	cout << "字符串有:" << s.length() << "个字符" << endl;
	cout << "打印字符串: " << s << endl;
	return 0;
}

运行结果:
在这里插入图片描述
注意: string的size()也可以用length()来代替,一般情况下使用length()只是为了更好的表明这是一个字符串而已。
此外,string也可以像vector那样使用方括号([])获取某个位置的字符。

获取string中的字符

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

//获取string中的字符

int main ()
{
    
	string s = "hello world!" ;
	for (int i = 0; i < s.length() ; i++)
	{
    
		if (i % 2)
		{
    
			cout <<s[i];
		}
	}
	cout << endl;
	return 0 ;
}

运行结果:
在这里插入图片描述
例子展示了使用下标操作符“[]”获取字符串的应用。


string的比较

string支持关系操作符,string的相等和不等判断有些类似与vector,都需要判断所有字符是否相等,只要有一个字符不等或者某一个字符串多一个字符,那么string就不相等。
string的大于、小于判断会对每个对应的字符分别作比较,出现不匹配的情况立刻返回结果。其中,字符的比较使用了字典的顺序,也就是依次比较字符串中每个字符ASCLL码值大小,一样的话则继续比较下一个。

string的比较

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

//string的比较

int main()
{
    
	string s1 = "";
	string s2 = "";
	for (int i = 0; i < 3; i++)
	{
    
		cout << "请输入两个用空格隔开的字符串:" << endl;
		cin >> s1 >> s2;
		if ( s1 < s2 )
		{
    
			cout << "字符串" << s1 << "小于" << s2 <<endl;
		}
		else if ( s1 > s2 )
		{
    
			cout << "字符串" << s1 << "大于" << s2 <<endl;
		}
		else
		{
    
			cout << "字符串" << s1 << "等于" << s2 <<endl;
		}
	}
	return 0 ;
}

运行结果:
在这里插入图片描述
例子中使用了将字符串字面量赋值给string的方法来初始化空字符串。

这个小程序支持输入,可以输入两个任意的字符串来加深对字符串比较规则的理解。例子中输入了3对字符串,分别展示了字符串比较的3个规则:

<1>字符串比较区分大小写,而大写字母比小写字母小(符合ASCLL码的顺序)。
<2>字符串不等长,但是在短的字符串与长的字符串的前一部分完全相等的情况下,短的string小于长的string。
<3>遇到第一对不匹配的字符就立刻返回按字典顺序比较的结果。

在这里 c 和 csharp 的开头都是 c ,因此长的csharp更大。csharp 和 cplusplus 的第一个字符都是 c ,就继续看第二个字符,由于 s 比 p 大,因此csharp 大于 cplusplus.


string的连接

string的连接是通过加法操作符实现的,加号两边可以随意组合string或是字符串字面量。

string的连接

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

//string的连接

int main()
{
    
	string s1 = "";
	string s2 = "";
	cout << "请输入两个用空格间隔的字符串:" << endl;
	cin >> s1 >> s2 ;
	string s3 = s1 + s2 ;
	cout << "字符串连接的结果为:" << s3 << endl;
	for (int i = 0;i < 3;i++)
	{
    
		string s4 = "";
		cout << "请输入字符串:" << endl;
		cin >> s4;
		s3 +=s4;
		cout << "字符连接的结果是: " << s3 << endl;
	}
	return 0;
}

运行结果:
在这里插入图片描述
例子展示了字符串的连接,除了加法操作符外,还可以用加法赋值符连接字符串。

如果本文对你有帮助,请点赞支持一下~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_62870588/article/details/123716198

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文