C++学习笔记之五(String类)

C++

  • 前言
    • getline
    • length, size
    • c_str
    • append, insert
    • erase
    • find
    • substr
    • isspace, isdigit

前言

C++是兼容C语言的,所以C++的字符串自然继承C语言的一切字符串,但它也衍生出属于自己的字符串类,即String类。String更像是一个容器,但它与容器还是有一些差别,我看网上很多人直接把它等同于一种容器,这种说法大概是有错误的。。。
string类的相关方法很多,下面我只记录一下我个人常用到的一些方法,必然不详实,仅供参考。
所有用到string类的地方都至少需要一个string的头文件,如果还需要其它的,我们另外注明。

#include <string>

getline

从用户端接收字符串方法其实挺多的,C语言中最常见的就是scanf函数了,类比这个函数,C++也可以用cin>>…的方式接收用户输入。但这两者都只能接收一个单词,或一个数字,因为它们会以空格符作为结尾。可以看看以下这个例子。

	string s;
	cout <<"please enter a string:  ";
	cin >> s;
	cout << s <<endl;

输出结果如下:
在这里插入图片描述
以空格为结尾的接收输入函数显然不是我们所希望的,一句话,难免有许多空格。那么这时候就需要用到getline函数了,这个函数读取的字符串会以换行符”\n“为结尾。

	 string s1;
	 cout <<"please enter a string:  ";
	 getline(cin, s1);
	 cout << s1 <<endl;

getline有两个参数,第一个传入参数是获取字符串的地方,第二个传入参数是字符串存放的地方。这里获取用户端输入,所以第一个参数就是cin了。
程序运行结果如下:
在这里插入图片描述

length, size

length是C++早期读取字符串长度的唯一方法,但后面为了兼容容器类,又推出了size方法。两者的作用是一模一样的。调用该函数会返回字符串的字符数,而非字节数。
用法也十分简单:

	string s1;
	cout <<"please enter a string:  ";
	getline(cin, s1);
	cout << s1.length() <<endl;

程序运行结果如下,注意空格也算一个字符。
在这里插入图片描述

c_str

c_str方法的作用是把C++的字符串类转化为常规的字符串,即变成可以用指针索引的字符串。因为有些函数要求传入参数是" char * "。比如open函数。
看下面这个例程,c_str只能转化为const char* 类型。并且由于字符指针指向的只能是一个字符,所以打印的时候需要用for循环打印出来。

	string path = "/home/object_file";
	const char *f;
	f = path.c_str();			
	for(int i=0; i<path.length(); i++)
	{
	    cout<< f[i];
	}
	cout<<"\n";

不过如果用C语言的printf函数,倒可以免去使用for循环,直接用%s告诉计算机这是一个字符串即可。

	string path = "/home/object_file";
	const char *f;
	f = path.c_str();
	printf("%s \n", f);

有string类转化为const char*,那放过来char *转化为string类也可以。操作十分简单,只需要直接赋值就行。

    char temp[15] = "hello world";
    string s = temp;
    cout << s << endl; 

append, insert

append方法和insert方法都是在原来的字符串的基础上添加某些东西,但前者是添加在字符串后面,后者则可以添加到指定位置。它们的用法都比较简单,直接看以下例子。

	string s1 = "hello ";
	string s2 = "word";
	s1.append("wrold");
	s2.insert(0, "add a ");			//第一个参数是插入的位置,第二个参数是插入的字符串
	cout <<"s1: "<< s1 << endl; 
	cout <<"s2: "<< s2 << endl; 

以上程序的运行情况如下:

s1: hello world
s2: add a word

erase

erase方法用来擦除字符串中的某些字符,在处理数据的时候还挺有用的。
直接看一个例子:

    string s = "hello world!";
    s.erase(3, 2);
    cout << s << endl;

程序运行结果如下:
在这里插入图片描述
可见,erase第一个传入参数是起始位置,第二个传入参数擦除的字符个数。如果没有添加第二个参数则视为,在擦除起始位置之后的全部字符。可以看个例子:

    string s = "hello world!";
    s.erase(3);
    cout << s << endl;				//打印结果是hel

熟悉C++容器的朋友大概会发现,这与容器的erase方法有一些不一样。以vector为例,erase(begin, end)的第一个参数是要擦除的起始位置,第二个位置是要擦除的结束位置,如果第二个参数不写,就默认只擦除一个成员。

find

find方法是从字符串中查找某个特定的字符,并且返回该字符第一次出现时的位置。当然find方法也有很多衍生方法,比如find_first_of, find_last_of等等。而对于这些衍生方法,大家有兴趣可以自行查阅相关资料。我这里就只说一下find的一些常规应用。

    string s = "hello world!";
    int loc = s.find("o");
    cout << loc << endl;

在"hello world!"这个字符串中,"o"第一个出现的位置是4,所以打印结果就是4。
而如果我们像知道"o"第二次出现的地方呢?可以参考以下这个例程:

    string s = "hello world!";
    int loc = s.find("o");
    int cnt = 1;
    while(loc != string::npos)
    {
        if(cnt == 2)    
            break;
        loc = s.find("o", loc+1);
        cnt ++;
    }
    cout << loc <<endl;

程序输出结果如下:
在这里插入图片描述
在"hello world!"这个字符中,"o"第二次出现的位置确实是7,符合预期。
那么总结一下,find有两个传入参数,第一个传入参数是期望查找的字符,第一个传入参数是字符串中搜索区域的起始位置,如果没有这个参数,则默认从头开始搜索。
find方法的返回值就是被搜索字符首次出现的位置,如果没有找到该字符,则返回string::npos。

substr

substr方法用于截取字符串中的某一段,它有两个参数,第一个参数是截取区间的起点,第二个参数是截取区间的终点。返回值是所截取出来的字符串。
以下例程的作用是将"hello world!"中的hello截取出来:

    string s = "hello world!";
    string sp = s.substr(0, 5);
    cout << sp << endl;

isspace, isdigit

isspace和isdigit分别是判断字符串中的空格和数字的函数,调用这两个函数的时候需要添加头文件cctype。其实这两个函数不是C++string类特有的,C语言中的字符串也可以用。

#include <cctype>

看个例子吧,该例子欲将"hello world!"中的空格抹去。

    string s = "hello world!";
    for(int i=0; i<s.length(); i++)
    {
        if(isspace(s[i])){
            s.erase(i, 1);
            i--;
        }
    }
    cout << s <<endl;

isspace的返回值是一个int类型,如果检查到空格就返回一个非零数据,否则返回0.
突然想到另一种消除空格方法,也一并写出来吧。

    string s = "hello world!";
    int cnt = 0;
    for(char i : s)
    {
        if(i == ' ')
        {
            s.erase(cnt, 1);
            cnt--;
        }
        cnt ++;
    }
    cout << s <<endl;

接下来再来看看isdigit的用法,isdigit和isspace的返回值很像,都是检查到目标则返回非零数字,否则返回0.
在本例程中,我欲将字符串"hello 123 world!"的数字打印出来。

    string s = "hello 123 world!";
    for(int i=0; i<s.length(); i++)
    {
        if(isdigit(s[i]))
        {
            int temp = s[i] - '0';
            cout<< temp;
        }
    }
    cout <<"\n";

输出结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/232941.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp如何制作一个收缩通讯录(布局篇)

html&#xff1a; <view class"search"><view class"search_padding"><u-search change"search" placeholder"请输入成员名称" v-model"keyword"></u-search></view></view> <view…

【面试经典150 | 二叉树】从中序与后序遍历序列构造二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容…

2020年第九届数学建模国际赛小美赛A题自由泳解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 A题 自由泳 原题再现&#xff1a; 在所有常见的游泳泳姿中&#xff0c;哪一种最快&#xff1f;哪个冲程推力最大&#xff1f;在自由泳项目中&#xff0c;游泳者可以选择他们的泳姿&#xff0c;他们通常选择前面的爬行。然而&#xff0c;游泳…

中文分词演进(查词典,hmm标注,无监督统计)新词发现

查词典和字标注 目前中文分词主要有两种思路&#xff1a;查词典和字标注。 首先&#xff0c;查词典的方法有&#xff1a;机械的最大匹配法、最少词数法&#xff0c;以及基于有向无环图的最大概率组合&#xff0c;还有基于语言模型的最大概率组合&#xff0c;等等。 查词典的方法…

esxi全称“VMware ESXi

esxi全称“VMware ESXi”&#xff0c;是可直接安装在物理服务器上的强大的裸机管理系统&#xff0c;是一款虚拟软件&#xff1b;ESXi本身可以看做一个操作系统&#xff0c;采用Linux内核&#xff0c;安装方式为裸金属方式&#xff0c;可直接安装在物理服务器上&#xff0c;不需…

TCP传输数据的确认机制

实际的TCP收发数据的过程是双向的。 TCP采用这样的方式确认对方是否收到了数据&#xff0c;在得到对方确认之前&#xff0c;发送过的包都会保存在发送缓冲区中。如果对方没有返回某些包对应的ACK号&#xff0c;那么就重新发送这些包。 这一机制非常强大。通过这一机制&#xf…

Redis如何做内存优化?

Redis如何做内存优化&#xff1f; 1、缩短键值的长度 缩短值的长度才是关键&#xff0c;如果值是一个大的业务对象&#xff0c;可以将对象序列化成二进制数组&#xff1b; 首先应该在业务上进行精简&#xff0c;去掉不必要的属性&#xff0c;避免存储一些没用的数据&#xff1…

博途PLC SCL间接寻址编程应用

这篇博客里我们将要学习Pointer和Any指针&#xff0c;PEEK和POKE指令&#xff0c;当然我们还可以数组类型数据实现数组指针寻址&#xff0c;具体应用介绍请参考下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/134761364https://rxxw-control.b…

15.Java程序设计-基于SSM框架的微信小程序校园求职系统的设计与实现

摘要&#xff1a; 本研究旨在设计并实现一款基于SSM框架的微信小程序校园求职系统&#xff0c;以提升校园求职流程的效率和便捷性。通过整合微信小程序平台和SSM框架的优势&#xff0c;本系统涵盖了用户管理、职位发布与搜索、简历管理、消息通知等多个功能模块&#xff0c;为…

分子生成领域的stable diffusion - GEOLDM

一、关于stable diffusion 很多人都知道stable diffusion&#xff0c;stable diffusion的出现改变了机器生成领域&#xff0c;让AI技术第一次无比的接近正常人。大语言模型&#xff0c;AIGC概念于是兴起。基于stable diffusion 大家开发了lora&#xff0c; hyperwork等微调技术…

【VS Code】Visual Studio Code 你必须安装的 Plugins - 持续更新

文章目录 GitLens — Git supercharged【真香】EditorConfig for VS Code【真香】Remote - SSH【真香】MySQL【真香】 Talk is cheap, show me the code. GitLens — Git supercharged【真香】 插件地址&#xff1a; https://marketplace.visualstudio.com/items?itemNameeam…

C语言有哪些预处理操作?

C语言的预处理是在编译之前对源代码进行处理的阶段&#xff0c;它主要由预处理器完成。预处理器是一个独立的程序&#xff0c;它负责对源代码进行一些文本替换和处理&#xff0c;生成经过预处理的代码。以下是C语言预处理的一些重要特性&#xff1a; 1&#xff0c;头文件包含 #…

侮辱性涨薪!业绩得了S,调薪涨了450

信安这个行业3年前各大媒体&#xff0c;信安自己人都觉得自己在个朝阳行业&#xff0c;红利在咋弄不得再吃5年。 现在拉个干网络安全的再去问问&#xff0c;看看谁不是去年年终奖砍了一半、或者根本就没了&#xff0c;再或者每天岌岌可危生怕去领大礼包。 原本10月份的激励性…

python变量的命名和使用

变量名只能包含字母、数字和下划线 变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头&#xff0c;但不能以数字打头。例如&#xff0c;可将变量命名为message_1&#xff0c;但不能将其命名为1_message。 Python 语言中&#xff0c;以下划线开头的标识符有特殊含…

Android 相机库CameraView源码解析 (五) : 保存滤镜效果

1. 前言 这段时间&#xff0c;在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位&#xff0c;在项目前期&#xff0c;的确为我们节省了不少时间。 但随着项目持续深入&#xff0c;对于CameraView的使用进入深水区&#xff0c;逐…

若依vue-新建目录及菜单

前面我们把标题和logo换成了自己系统的标题和logo了 接下来就是要建立自己需要的菜单和页面 新建目录解析 在拉下来的代码跑起来后 有一个系统菜单--菜单管理(如图) 在这个菜单的这个页面内有对应的操作功能 修改功能 这个功能可以修改写好了的菜单数据 例如:名称/排序/路由…

(一)五种最新算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

vscode 编译运行c++ 记录

一、打开文件夹&#xff0c;新建或打开一个cpp文件 二、ctrl shift p 进入 c/c配置 进行 IntelliSense 配置。主要是选择编译器、 c标准&#xff0c; 设置头文件路径等&#xff0c;配置好后会生成 c_cpp_properties.json&#xff1b; 二、编译运行&#xff1a; 1、选中ma…

SpringBoot的依赖管理和自动配置

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 依赖管理机制2 自动配置机制2.1 初步理解2.2 完整流程 &#x1f48e;总结 1 依赖管理机制 为什么导入starter-web后所有相关依赖都会导入进来&#xff1f; 开发什么场景&#xff0c;导入什么场景启动器-spring-bo…

[ROS2] --- action

1 action介绍 ROS通信机制也会被常常用到——那就是动作。从这个名字上就可以很好理解这个概念的含义&#xff0c;这种通信机制的目的就是便于对机器人某一完整行为的流程进行管理。 1.1 客户端/服务器模型 动作和服务类似&#xff0c;使用的也是客户端和服务器模型&#xf…