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

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

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

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

相关文章

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示登录成功&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xff0c;弹…

被迫搬家,宽带迁移怎么办?

广州一栋违建烂尾楼&#xff0c;13年里从未停止出租&#xff0c;年年住满人。这栋楼没有贴外墙&#xff0c;裸露的水泥表面都被雨水腐蚀&#xff0c;很多阳台没有建好&#xff0c;只是简单加装了护栏&#xff0c;存在巨大安全隐患。 为什么烂尾楼年年满人呢&#xff1f; 因为它…

基于ssm乐购游戏商城系统论文

摘 要 随着社会的发展&#xff0c;游戏品种越来越多&#xff0c;计算机的优势和普及使得乐购游戏商城系统的开发成为必需。乐购游戏商城系统主要是借助计算机&#xff0c;通过对信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对个人所需信息的及时查询以及管理…

基于深度学习的yolov5入侵检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介IntroductionYOLOv5 Overview入侵检测系统架构1. 数据采集2. YOLOv5模型训练3. 实时监测4. 告警与反馈 性能评估与优化 二、功能三、系统四. 总结 一项目简…

Huawei Auth-HTTP Server 1.0 存在任意文件读取漏洞 附POC软件

@[toc] Huawei Auth-HTTP Server 1.0 存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学…

视频中自监督学习:「我的世界」下指令理解与跟随

本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展&#xff0c;题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 ​ GROOT 该研究的核心目标是探索能否摆脱文本数据的标…

【NR技术】NR NG-RAN整体架构 -网络接口以及无线协议框架(四)

1 引言 本博文介绍NR NG-RAN的网络节点间的接口以及无线协议框架。网络接口介绍包括RAN和NGC之间的NG接口&#xff1b;无线协议框架包括用户面和控制面协议。 2 NG接口 2.1 NG用户面接口 NG-U (user plane interface)是NG-RAN节点与UPF之间的接口。NG接口的用户平面协议栈如图…

AutoGen实战应用(一):代码生成、执行和调试

AutoGen 是一个支持使用多个代理来开发大型语言模型(LLM) 应用程序的框架&#xff0c;这些代理采样相互对话的方式来解决人类交给的任务。AutoGen 代理是可定制的、可对话的&#xff0c;并且无缝地允许人类参与。他们采用LLM、人类输入和各种工具组合的各种运作模式。 AutoGen …

docker 安装mysql 主从复制

一、搭建主服务器的mysql 1.1 先新建文件夹 mkdir -p /data/dockerData/mysql-master/conf 1.2 进入/data/dockerData/mysql-master/conf目录下新建my.config, [mysqld] ## 设置server_id&#xff0c;同一局域网中需要唯一 server_id101 ## 指定不需要同步的数据库名称 bin…

论文阅读《High-frequency Stereo Matching Network》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_High-Frequency_Stereo_Matching_Network_CVPR_2023_paper.pdf 源码地址&#xff1a; https://github.com/David-Zhao-1997/High-frequency-Stereo-Matching-Network 概述 在立体匹配研究领域…

web漏洞原理与防御策略,web漏洞怎么挖掘

目录 Web安全的重要性 ​编辑常见的Web漏洞类型及其原理&#xff1a; 1、跨站脚本攻击&#xff08;XSS&#xff09;: 2、SQL注入: 3、跨站请求伪造&#xff08;CSRF&#xff09;: 4、远程文件包含&#xff08;RFI&#xff09;和本地文件包含&#xff08;LFI&#xff09;:…

Spring Boot实现接口幂等

Spring Boot实现接口幂等 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

大创项目推荐 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

【软件安装】VMware安装Centos7虚拟机并且设置静态IP,实现Windows和Centos7网络互相访问

这篇文章&#xff0c;主要介绍VMware安装Centos7虚拟机并且设置静态IP&#xff0c;实现Windows和Centos7网络互相访问。 目录 一、VMware安装Centos7 1.1、下载Centos7镜像 1.2、安装Centos7系统 二、设置静态IP地址 2.1、查看虚拟机网络IP 2.2、禁用NetworkManager服务 …

每天五分钟计算机视觉:VGG网络相对于AlexNet网络有哪些不同?

本文重点 在前面的课程中&#xff0c;我们已经学习了VGG网络模型&#xff0c;也学习了AlexNet网络模型&#xff0c;AlexNet模型先于VGG网络模型产生&#xff0c;所以VGG在一定程度上要优于AlexNet模型&#xff0c;二者来看一下&#xff0c;二者究竟有什么不同&#xff1f; 深度…

Qt的坐标系系统 - 3个坐标系,2个变换

参考&#xff1a; https://zhuanlan.zhihu.com/p/584048811https://www.zhihu.com/tardis/zm/art/634951149?source_id1005 小谈Qt的坐标系系统 Qt中有三个坐标系 设备坐标系窗口坐标系逻辑坐标系 设备坐标系: 即Device坐标系。也是物理坐标系。即真实的的物理坐标系。 …

【Linux】free命令使用

free命令 ​free是指查看当前系统内存的使用情况&#xff0c;它显示系统中剩余及已用的物理内存和交换内存&#xff0c;以及共享内存和被核心使用的缓冲区。 作者 作者&#xff1a;Brian Edmonds。 语法 free [参数] free 命令 -Linux手册页 命令选项及作用 执行令 &am…

【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations &#xff0c;其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所有城…

Java学习总结

1. Java集合体系框架 java.util中包含 Java 最常用的the collections framework。 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection 接口派生出了三个子接口List、Set、Queue。Map 接口 因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。 …

CDH6.3.2安装

文章目录 [toc]一、CM简介1、ClouderaManager的概念2、ClouderaManager的功能3、ClouderaManager的架构 二、准备清单1、部署步骤2、集群规划3、软件环境准备 三、安装清单1、操作系统iso包2、JDK包3、MySQL包4、CM和CDH包5、部署ansible 四、基础环境准备1、配置网络2、配置ho…