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

news2024/11/29 22:30:08

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";

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HJ103 Redraiment的走法

题目&#xff1a; HJ103 Redraiment的走法 题解&#xff1a; dfs 暴力搜索 枚举数组元素&#xff0c;作为起点如果后续节点大于当前节点&#xff0c;继续向后搜索记录每个起点的结果&#xff0c;求出最大值 public int getLongestSub(int[] arr) {int max 0;for (int i 0…

MySQL - 表达式With as 语句的使用及练习

目录 8.1 WITH AS 的含义 8.2 WITH AS语法的基本结构如下&#xff1a; 8.3 练习题1 8.4 牛客练习题 8.1 WITH AS 的含义 WITH AS 语法是MySQL中的一种临时结果集&#xff0c;它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句&#xff0c;可以将一个查…

flstudio21.3完整高级版怎么下载?有哪些新功能

flstudio高级版是一款适用于广泛领域的音频编辑软件。它支持多通道混音器和VST插件&#xff0c;包括数百种乐器和效果插件。它还为您提供了一个乐谱编辑器&#xff0c;需要对不同乐器的节奏进行必要的编辑。Flstudio具有许多内置电子合成声音&#xff0c;可提供更广泛的电子声音…

运维06:监控

监控生命周期 1.服务器上架到机柜2.基础设施监控 服务器温度&#xff0c;风扇转速 ipmitool命令&#xff0c;只能用在物理机上 存储的监控&#xff08;df, fdisk, iotop&#xff09; cpu&#xff08;lscpu, uptime, top, htop, glances&#xff09; 内存情况&#xff08;free&…

CSS-自适应导航栏(flex | grid)

目标&#xff1a;实现左右各有按钮&#xff0c;中间是内容&#xff0c;自适应显示中间的内容导航栏&#xff0c;即 根据中间的宽度大小显示内容。 自适应导航栏 总结&#xff1a;推荐 flex布局 / grid布局 flex布局&#xff1a; 两侧 flex:1; ----->中间自适应 grid布局&…

【MATLAB】基于EEMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EEMD分解的信号去噪算法&#xff08;基础版&#xff09; 代码的主要内容 基于EEMD&#xff08;集合经验模态分解&#xff09;的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值&#xff0c;从而…

Java线程概念详解

线程 概念 1.程序:未解决某种问题,使用计算机语言编写的一些列指令(代码)的集合 2.进程:正在运行的程序(被加载到内存中),是操作系统进行资源分配的最小单位 3.线程:进程可以进一步细化为线程(比进程更小)且线程是隶属于进程的,是操作系统执行的最小的执行单元 也是cpu进行任…

整合,降价,官司……2023休闲零食行业大变局

休闲零食行业正从暗战走向明战。 11月27日&#xff0c;宁波广源聚亿投资有限公司&#xff08;以下简称“广源聚亿”&#xff09;因被投企业宜春赵一鸣食品科技有限公司&#xff08;以下简称“赵一鸣”&#xff09;在双方合作期内&#xff0c;刻意隐瞒公司重大事项&#xff0c;…

Matlab数学建模算法之小波神经网络详解

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境 前言一、介绍 mkcert二、安装/使用 mkcert1. 安装2. 使用 总结 前言 本地开发时有些功能只有在 https 证书的情况下才能使用, 例如一些 Web API 一、介绍 mkcert Github地址 mkcert 是一个制作本地可信开发证书的简单工具。…

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…

无人零售店,凭借黑科技引领,它的前景如何?

无人零售店&#xff0c;凭借黑科技引领&#xff0c;它的前景如何&#xff1f; 近年来&#xff0c;无人新零售行业快速兴起&#xff0c;引起了广泛的关注和兴趣。尤其是在疫情之后&#xff0c;人们才真正认识到了无人零售的概念。如今&#xff0c;无人零售行业正在以直线的方式高…

U2 文法和语言

文章目录 一、预备知识1、字母表和符号串2、符号串形式定义3、符号串相等4、延申 二、文法1、 一些概念2、文法的定义3、推导的形式定义4、规范推导5、语言的形式定义6、递归文法7、BNF范式总结 三、短语、简单短语和句柄四、语法树(推导树)1、概念2、语法树推导--句型的推导3、…

打造Github首页的动态飞线效果

一、导语 Github首页的地球动态飞线&#xff0c;大家都比较熟悉吧 二、分析 由大量随机的3点构造出贝塞尔曲线&#xff0c;然后开始从起点到终点的飞行后&#xff0c;然后再从起点到终点的消失&#xff0c;就此完成整个过程 三、基础代码 createCurve(startPoint, endPoint…

爬虫解析-jsonpath (六)

jsonpath只能解析本地文件 jsonpath的使用&#xff1a; obj json.load(open(.json文件,r,encodingutf-8))place_name jsonpath.jsonpath(obj, json语法) 目录 1.安装jsonpath 2.Xpath和jsonpath的语法对比 练习&#xff1a;使用jsonpath解析JSON文件 3.使用jsonpath抓取…

论文代码阅读:TGN模型训练阶段代码理解

文章目录 [toc] TGN模型训练阶段代码理解论文信息代码过程手绘代码训练过程compute_temporal_embeddingsupdate_memoryget_raw_messagesget_updated_memoryself.message_aggregator.aggregateself.memory_updater.get_updated_memoryMemoryget_embedding_moduleGraphAttentionE…

从线性回归到神经网络

一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 在了解线性回归的关键思想之后&#xff0c;我们可以开始通过代码来动手实现线性回归了。在这一节中&#xff0c;我们将从零开始实现整个方法&#xff0c;包括数据流水线、模型、损失函数和小批量…

深度探索Linux操作系统 —— 从内核空间到用户空间

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 文章目录 系列文章目录一、Linux操作系统加…

Java IO流(六)(字符流FileReader和FileWriter)

字符流 字符流的底层其实就是字节流 字符流字节流字符集 特点 输入流&#xff1a;一次读一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节 使用场景 对于纯文本文件进行读写操作 FileReader类 ①创建字符输入流对象 构造方法 说明 public FileReader(File f…

Configuring environment||ROS2环境配置

Goal: This tutorial will show you how to prepare your ROS 2 environment. Tutorial level: Beginner Time: 5 minutes ROS 2 relies on the notion &#xff08;concept&#xff09;of combining workspaces using the shell environment. “Workspace” is a ROS term …