字符串详解+代码分析

目录

 

1. 字符与整数的联系——ASCII码每个常用字符都对应一个-128 ~ 127的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符。

2.字符数组

2.2 字符数组的常用操作下面几个函数需要引入头文件:

2.3 遍历字符数组中的字符:

3. 标准库类型string可变长的字符序列,比字符数组更加好用。需要引入头文件:

3.1 定义和初始化

3.2 string上的操作

(2) 使用getline读取一整行

(3) string的empty和size操作(注意size是无符号整数,因此 s.size() <= -1一定成立):

(4) string的比较:

(5) 为string对象赋值:

(6) 两个string对象相加:

(7) 字面值和string对象相加:

3.3 处理string对象中的字符可以将string对象当成字符数组来处理:

4.string中元素的访问

1、[ ]+下标 因为string类对[ ]运算符进行了重载,所以我们可以直接使用[ ]+下标访问对象中的元素。并且该重载使用的是引用返回,所以我们可以通过[ ]+下标修改对应位置的元素。

2、使用at访问对象中的元素 因为at函数也是使用的引用返回,所以我们也可以通过at函数修改对应位置的元素。

3、使用范围for访问对象中的元素

5.string中子字符串的提取

1、使用substr函数提取string中的子字符串


 

1. 字符与整数的联系——ASCII码
每个常用字符都对应一个-128 ~ 127的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符。

#include <iostream>using namespace std;int main()
{char c = 'a';cout << (int)c << endl;int a = 66;cout << (char)a << endl;return 0;
}

常用ASCII值:'A'- 'Z'是65 ~ 90,'a' - 'z'是97 - 122,0 - 9是 48 - 57。
字符可以参与运算,运算时会将其当做整数:

#include <iostream>using namespace std;int main()
{int a = 'B' - 'A';int b = 'A' * 'B';char c = 'A' + 2;cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}

2.字符数组

字符串就是字符数组加上结束符'\0'。

可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个'\0'字符,因此字符数组的长度至少要比字符串的长度多 1 !

 

#include <iostream>using namespace std;int main()
{char str[100];cin >> str;             // 输入字符串时,遇到空格或者回车就会停止cout << str << endl;    // 输出字符串时,遇到空格或者回车不会停止,遇到'\0'时停止printf("%s\n", str);return 0;
}

读入一行字符串,包括空格:

#include <iostream>using namespace std;int main()
{char str[100];fgets(str, 100, stdin);  // gets函数在新版C++中被移除了,因为不安全。// 可以用fgets代替,但注意fgets不会删除行末的回车字符cout << str << endl;return 0;
}

2.2 字符数组的常用操作
下面几个函数需要引入头文件:

#include <string.h>
(1) strlen(str),求字符串的长度
(2) strcmp(a, b),比较两个字符串的大小,a < b返回-1,a == b返回0,a > b返回1。这里的比较方式是字典序!
(3) strcpy(a, b),将字符串b复制给从a开始的字符数组。

#include <iostream>
#include <string.h>using namespace std;int main()
{char a[100] = "hello world!", b[100];cout << strlen(a) << endl;strcpy(b, a);cout << strcmp(a, b) << endl;return 0;
}

2.3 遍历字符数组中的字符:
 

#include <iostream>
#include <string.h>using namespace std;int main()
{char a[100] = "hello world!";// 注意:下述for循环每次均会执行strlen(a),运行效率较低,最好将strlen(a)用一个变量存下来for (int i = 0; i < strlen(a); i ++ )cout << a[i] << endl;return 0;
}

3. 标准库类型string
可变长的字符序列,比字符数组更加好用。需要引入头文件:

#include <string>

3.1 定义和初始化

#include <iostream>
#include <string>using namespace std;int main()
{string s1;              // 默认初始化,s1是一个空字符串string s2 = s1;         // s2是s1的副本,注意s2只是与s1的值相同,并不指向同一段地址string s3 = "hiya";     // s3是该字符串字面值的副本string s4(10, 'c');     // s4的内容是 "cccccccccc"return 0;
}

3.2 string上的操作

(1) string的读写:

#include <iostream>
#include <string>using namespace std;int main()
{string s1, s2;cin >> s1 >> s2;cout << s1 << s2 << endl;return 0;
}

注意:不能用printf直接输出string,需要写成:printf(“%s”, s.c_str());

(2) 使用getline读取一整行

#include <iostream>
#include <string>using namespace std;int main()
{string s;getline(cin, s);cout << s << endl;return 0;
}

(3) string的empty和size操作(注意size是无符号整数,因此 s.size() <= -1一定成立):

#include <iostream>
#include <string>using namespace std;int main()
{string s1, s2 = "abc";cout << s1.empty() << endl;cout << s2.empty() << endl;cout << s2.size() << endl;return 0;
}

(4) string的比较:

支持 >, <, >=, <=, ==, !=等所有比较操作,按字典序进行比较。

(5) 为string对象赋值:

string s1(10, 'c'), s2;     // s1的内容是 cccccccccc;s2是一个空字符串
s1 = s2;                    // 赋值:用s2的副本替换s1的副本// 此时s1和s2都是空字符串

(6) 两个string对象相加:

做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:string s1 = "hello", s2 = "world";      // 在s1和s2中都没有标点符号
string s3 = s1 + ", " + s2 + '\n';

(7) 字面值和string对象相加:

做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:

string s1 = "hello", s2 = "world";      // 在s1和s2中都没有标点符号
string s3 = s1 + ", " + s2 + '\n';

当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:

string s4 = s1 + ", ";  // 正确:把一个string对象和有一个字面值相加
string s5 = "hello" + ", "; // 错误:两个运算对象都不是stringstring s6 = s1 + ", " + "world";  // 正确,每个加法运算都有一个运算符是string
string s7 = "hello" + ", " + s2;  // 错误:不能把字面值直接相加,运算是从左到右进行的

3.3 处理string对象中的字符
可以将string对象当成字符数组来处理:

#include <iostream>
#include <string>using namespace std;int main()
{string s = "hello world";for (int i = 0; i < s.size(); i ++ )cout << s[i] << endl;return 0;
}

或者使用基于范围的for语句:

#include <iostream>
#include <string>using namespace std;int main()
{string s = "hello world";for (char c: s) cout << c << endl;for (char& c: s) c = 'a';cout << s << endl;return 0;
}

4.string中元素的访问

1、[ ]+下标
 因为string类对[ ]运算符进行了重载,所以我们可以直接使用[ ]+下标访问对象中的元素。并且该重载使用的是引用返回,所以我们可以通过[ ]+下标修改对应位置的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("CSDN");//[]+下标访问对象元素for (size_t i = 0; i < s.size(); i++){cout << s[i];}cout << endl;//[]+下标修改对象元素内容for (size_t i = 0; i < s.size(); i++){s[i] = 'x';}cout << s << endl; //xxxxreturn 0;
}

2、使用at访问对象中的元素
 因为at函数也是使用的引用返回,所以我们也可以通过at函数修改对应位置的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("CSDN");for (size_t i = 0; i < s.size(); i++){//at(pos)访问pos位置的元素cout << s.at(i);}cout << endl;for (size_t i = 0; i < s.size(); i++){//at(pos)访问pos位置的元素,并对其进行修改s.at(i) = 'x';}cout << s << endl; //xxxxreturn 0;
}

3、使用范围for访问对象中的元素

需要特别注意的是:若是需要通过范围for修改对象的元素,则用于接收元素的变量e的类型必须是引用类型,否则e只是对象元素的拷贝,对e的修改不会影响到对象的元素。

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("CSDN");//使用范围for访问对象元素for (auto e : s){cout << e;}cout << endl; //CSDN//使用范围for访问对象元素,并对其进行修改for (auto& e : s) //需要修改对象的元素,e必须是引用类型{e = 'x';}cout << s << endl; //xxxxreturn 0;
}

5.string中子字符串的提取

1、使用substr函数提取string中的子字符串

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1("abcdef");string s2;//substr(pos, n)提取pos位置开始的n个字符序列作为返回值s2 = s1.substr(2, 4);cout << s2 << endl; //cdefreturn 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{string s("abcdef");char str[20];//copy(str, n, pos)复制pos位置开始的n个字符到str字符串size_t length = s.copy(str, 4, 2);//copy函数不会在复制内容的末尾附加'\0',需要手动加str[length] = '\0';cout << str << endl; //cdefreturn 0;
}

 

 

 

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

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

相关文章

ICMP协议以及报文讲解(ICMP查询报文、ICMP差错报文)

目录 ICMP协议 ICMP报文格式 ICMP回显请求/应答报文 ICMP差错报文 ICMP 宿主机不可达差错报文 ICMP 重定向差错报文 ICMP TTL超时差错报文 ICMP协议 ICMP协议的作用 ICMP&#xff08;Internet Control massage protocol&#xff09;因特网控制协议&#xff0c;主要用来…

C语言再学习 -- 单精度(float)和双精度(double)浮点数 与 十六进制(HEX) 之间转换(转载))

之前讲过浮点数部分&#xff0c;参看&#xff1a;C语言再学习 – 浮点数 现在程序中要将浮点数&#xff0c;通过TCP发送。那得先将其转换为十六进制才行呀。 那么问题就来了。 参看&#xff1a;C语言&#xff1a;单精度(float)和双精度(double)浮点数 与 十六进制(HEX) 之间…

(JAVA)-打印流

打印流是高级流&#xff0c;只能写不能读&#xff0c;只有输出流 只操作文件目的地&#xff0c;不操作数据源 能实现数据的原样输出 printStream:字节打印流 构造方法&#xff1a; 用文件或地址的方式创建字节打印流也会创建一个字节基本流。 字节流底层没有缓存区&#xff…

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF&#xff0c;批处理模式使扫描过程快速高效&#xff0c;自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件&#xff0c;您无需在扫描仪和计算机之间来回移动…

SpringBoot 官方脚手架不再支持Java8和Java11

Spring 官方脚手架不再支持初始化 Java8 和 Java 11 项目&#xff0c;目前仅支持初始化Java17 和 Java21 项目。 阿里巴巴Spring脚手架支持初始化Java8、Java11、Java17、Java19 的项目&#xff0c;不支持初始化Java21的项目。

Torn Lucky Ticket

题目 #include<bits/stdc.h> using namespace std; #define int long long const int maxn 1e6 5, d 500; vector<string> vec[6]; int mp[1005]; signed main(){int n;cin >> n;for(int i 1; i < n; i){string s;cin >> s;int len s.size();…

java简述springboot内置数据库 并举例启动h2内存数据环境

在前面 我们讲了 springboot 给我们提供了 默认的 数据源 默认 HikariCP 以及其他两种内置数据源 持久化技术 JdbcTemplate 那么 说起来很多人难以置信 不过 springboot 也真的给我们内置了数据库技术 而且不止一种 是三种 这三个数据库的特点在于 它们都是用java语言写的 就表…

28 动态规划解按摩师的最长预约时间

问题描述&#xff1a;一名有名的按摩师会受到源源不断的预约请求&#xff0c;每个预约都可以选择接或者不接&#xff0c;在每次预约服务之间要有休息时间&#xff0c;因此不能接相邻的预约&#xff0c;给定一个请求序列&#xff0c;按摩师找到最优的预约集合(总预约时间最长)&a…

探索中文文本处理利器 - Python jieba库详解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com jieba库介绍 在处理中文文本数据时&#xff0c;分词是一项至关重要的任务。而在Python的工具箱中&#xff0c;jieba库作为一款强大的中文分词工具&#xff0c;为开发者提供了高效而灵活的解决方案。jieba&#…

JDK8新特性:Lambda表达式规则及用法,方法引用

目录 Lambda表达式是JDK8新增的一种语法格式 1.作用 2.用法规则&#xff1a; 3.方法引用 Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

Python dateutil 库:简化日期和时间处理的利器

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;处理日期和时间是常见的任务之一。dateutil库是Python标准库中datetime模块的扩展&#xff0c;提供了许多方便的工具和函数&#xff0c;简化了日期和时间的操作。 安装与基本用法 首先&…

小黑子之——MybatiPlus整合

MybatiPlus学习 一、MybatiPlus简介1.1 入门案例1.2 mybatisPlus概述1.3 总结 二、标准数据层开发2.1 标准的CRUD使用2.2 新增2.3 删除2.4 修改2.5 根据Id查询2.6 查询全部2.7 Lombok2.8 分页功能 三、DQL控制3.1 条件查询方式3.1.1 构建条件查询3.1.2 多条件查询3.1.3 null值判…

运维05:自动化

人工运维时代 运维人员早期需要维护众多的机器&#xff0c;因此需要执行很多重复的劳动&#xff0c;很多机器需要同时部署相同的服务或者是执行相同的命令&#xff0c;还得反复地登录不同的机器&#xff0c;执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…

Java基础——对象类型转换(向上、向下转型)

非继承关系的类之间对象类型不可以互相类型转换&#xff0c;只有继承关系才可以互相转换。 简单说&#xff0c;对象类型转换的前提要是继承关系。 对象类型转换分为&#xff1a;向上转型和向下转型。多态就是一种自动向上转型。 向上转型&#xff1a;子类对象用父类类型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解题思路2. 代码实现 题目链接&#xff1a;2963. Count the Number of Good Partitions 1. 解题思路 这一题根据题意&#xff0c;显然我们可以将其先分为 n n n个原子partition&#xff0c;确保任意两个partition之间…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看远程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追踪的分支 2.创建分支 方法1 $ git branch 分支名 #创建本地分支 #将本地分支push&#xff0c;就创建了远程分支方法2 #创建本地分…

载入了名字空间‘htmltools’ 0.5.6,但需要的是>= 0.5.7解决方案

解决方案&#xff1a;删除之前的旧版本安装包&#xff0c;安装新的包 1.卸载之前的安装包 2.关闭R&#xff0c;重新打开 3. # install.packages("htmltools") library(htmltools)

Java 并发编程(一)

1、在 java 中守护线程和本地线程区别&#xff1f; java 中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09; 任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法 Thread.setDaemon(boolon)&#xff1b;tru…

HarmonyOS学习--了解基本工程目录

1.工程级目录 工程的目录结构如下&#xff1a; 其中详细如下&#xff1a; AppScope中存放应用全局所需要的资源文件。entry是应用的主模块&#xff0c;存放HarmonyOS应用的代码、资源等。oh_modules是工程的依赖包&#xff0c;存放工程依赖的源文件。build-profile.json5是工…

如何找到MACOS系统更新的安装包

首先在应用商店中下载新系统的安装包&#xff0c;然后在设置中不要点安装&#xff0c;会自动跳出安装的界面&#xff0c;不要关闭界面&#xff0c;打开命令行用root权限输入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就会显示 sh-3.2# cat /var/log/install.log …