C++基础之字符串string
C++基础之字符串string
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准裤的一部分,string定义在命名空间std中。
定义和初始化string对象
初始化string对象的方法有很多种,具体可以参见如下的表格:
| 方法 | 含义 |
|---|---|
| string str | 默认初始化,str是一个空串 |
| string str2(str1) | str2是str1的副本 |
| string str2 = str1 | 等价于str2(str1),str2时str1的副本 |
| string str3("value") | str3是字面值"value"的副本,除了字面值字符串最后的结束字符 |
| string str3 = "value" | 同str3("value"),str3是"value"的副本 |
| string str4(n, 'c') | 把str4初始化为由n个字符c组成的串 |
string对象上的操作
如下列出的是string对象上的大部分操作:
| 方法 | 含义 |
|---|---|
| str.empty() | 判断是否为空 |
| str.size() | 返回str中字符的个数 |
| str1 + str2 | 返回str1和str2连接的结果 |
| str1 = str2 | 用str2的副本代替str1中原来的字符 |
| ==, !=, <, <=, >, >= | string对象的相等性判断,对大小写敏感 |
读写string对象
我们知道可以使用标准库中的iostream来读写int, double等内置类型的值。同样的,我们也可以使用IO操作符读写string对象。
#include<iostream>
#include<string>
using namespace std;
int main() {
string s; // 空字符串
cin >> s; // 将string对象读入s,遇到空白停止
cout << s << endl; // 输出s
return 0;
}
在以上的代码段中,is>>s读入操作符在遇到空格的时候会自动停止,而且会忽略开头的空白从第一个真正的字符开始读起。如果要读入Hello world!这样的内容,则可以这样做:
string s1, s2;
cin >> s1 >> s2; // 读入第一个到s1中再读入第二个到s2中
cout << s1 << s2 << endl;
读取数量未知的string对象
通过对输入流的判断得知当前的读取是否有效
int main() {
string word;
while (cin >> word)
cout << word << endl;
return 0;
}
使用getline读取一整行
有时候我们想要能够连续的读入多个单词到一个string对象中,即使遇到了空格也能够继续的读下去,这个时候就应该是getline函数代替原来的is>>s操作符。
getline函数的参数是一个输入流和一个string对象,函数从输入流中读入内容,直到换行符为止(注意换行符也被读了进来),然后把所读的内容存入到string对象中(注意不存换行符)。如果一开始输入的便是换行符,那么所得的结果就是空的string。
int main() {
string line;
while (getline(cin, line)) {
cout << line << endl;
}
return 0;
}
- 因为line中不包含换行符,所以需要手动的加上换行符。
- 触发getline函数返回的换行符实际被丢失了,实际得到的string对象不包含换行符。
string的size操作
size函数返回string对象的长度,即string对象中字符的个数,其类型为string::size_type。
string类及其他大多数标准库类型都定义了几种配套的类型,这些配套的类型体现了标准库类型与机器无关的特性。
string::size_type是一个无符号类型的值而且能够存放下任何string对象的大小。因为是无符号数所以不能和有符号数混用。例如,假设n是一个具有负值的int,则表达式s.size() < n的判断结果几乎肯定是true,这是因为负数会自动的转换成一个比较大的无符号数。
如果一条表达式中已经有了
size()函数就不要再使用int了,这样就可以避免上述的意外发生。
我们可以使用auto类型或decltype来使用string::size_type类型的值。
auto len = line.size();
字面值和string对象相加
我们知道两个string对象通过相加会得到一个新的string对象,其内容就是把后一个对象与前一个对象拼接而成。不仅如此,标准库还允许把字符字面值和字符串字面值转换成string对象与string对象进行相加,所以我们能够写出这样的代码:
string s1 = "hello", s2 = "world";
string s3 = s1 + ", " + s2 + '\n'; // string对象和字符串字面值和自负字面值相加
但是要注意的是必须确保每个加法运算符的两侧运算对象至少有一个string对象。
string s4 = s1 + ", "; // 正确,一个string对象和一个字面值相加
string s5 = "hello" + ", "; // 错误,两个运算对象都不是string
string s6 = s1 + ", " + "world"; // 正确,每个运算符两侧都是string
string s7 = "hello" + ", " + s2; // 错误,第一个运算符两侧都是字面值
处理string对象中的字符
在这里先提个题外话,在C++的cctype头文件中定义了一组标准库函数来处理某个字符的特性,具体见表:
| 操作 | 含义 |
|---|---|
| isalnum(c) | 当c是字母或是数字时为真 |
| isalpha(c) | 当c是字母时为真 |
| isdigit(c) | 当c是数字时为真 |
| islower(c) | 当c是小写字母时为真 |
| isupper(c) | 当c是大写字母时为真 |
| tolower(c) | 如果c是大写字母,则输出对应的小写字母;否则原样输出c |
| toupper(c) | 如果c是小写字母,则输出对应的大写字母;否则原样输出c |
C++标准库中除了定义C++语言特有的功能外,也兼容C语言的标准库。C语言的头文件形如name.h,C++则将这些文件命名为cname。去掉了
.h后缀,添加了前缀c,表示这是一个属于C语言标准库的头文件。一般来说,C++程序应该使用名为cname的头文件而不是用name.h的形式,标准库中的名字总能在命名空间
std中找到。
使用范围for语句处理每个字符
通过使用范围for语句,我们可以很方便的遍历整个字符串。其语法形式为:
for (declaration : expression)
statement
其中, expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。
通过使用范围for语句可以遍历string对象中的每个字符。
string str("some string");
for (auto c : str) {
cout << c << endl;
}
还可以通过引用改变字符串中的字符:
string str("some string");
for (auto &c : str) {
c = toupper(c);
}
cout << str << endl;
除了使用引用的方法外还可以通过下标来处理字符:
for (decltype(str.size()) index = 0; index != str.size(); ++index) {
str[index] = toupper(str[index]); // 将当前字符改写为大写形式
}
可以看到c++中的字符串对象要比c中的字符串数组好用的多。
C++基础之字符串string的更多相关文章
- Java基础——数组应用之字符串String类
字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...
- Python基础数据类型-字符串(string)
Python基础数据类型-字符串(string) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版 ...
- Javascript基础系列之(三)数据类型 (字符串 String)
javascript一共有9种数据类型 字符串 String 数值型 Number 布尔型 Boolean 未定义 Undefine 空值 Null 对象 Object 引用Refernce 列表型 ...
- Lua基础之字符串(string)
1,计算字符串长度 2,返回字符串s的n个拷贝 3,返回字符串全部字母大写 4,返回字符串全部字母小写 5,返回一个类似printf的格式化字符串 6,根据下标截取字符串 7,在字符串中查找 8,在字 ...
- Java基础 - 字符串 String
字符串就是用字符拼接成的文本值,字符串在存储上类似数组,在java语言中把字符串当做对象进行处理 创建字符串 package com.mingri.chapter_02; public class d ...
- JAVA基础——重新认识String字符串
深入剖析Java之String字符串 在程序开发中字符串无处不在,如用户登陆时输入的用户名.密码等使用的就是字符串. 在 Java 中,字符串被作为 String 类型的对象处理. String 类位 ...
- JavaScript (JS)基础:DOM 浅析 (含数组Array、字符串String基本方法解析)
①文本对象document: 例如:document.getElementById() 只获取一个对象 document.getElementsByTagName() 获取 ...
- c#编程基础之字符串基础
1.C#中单个的字符串用单引号包含就是char类型,('a'),单引号中放且只能放一个字符 2.单个字符也可以表示为字符串,还可以有长度为0的字符串. 3.使用s.Length属性来获得字符串中的字符 ...
- C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)
在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...
随机推荐
- \r、\n、\r\n的区别-转载
文章地址: https://blog.csdn.net/qq_40395278/article/details/81199281 https://blog.csdn.net/qq592304796/a ...
- [Netcat] 断线重连 自动重连
今天想做些操作,所以想到了nc 但是nc太过于轻量级 所以 导致我没有找到他的断线重连功能 然后我就想到了windows的神器之一 vbs脚本 vbs代码如下 Dim a,b set a= WScri ...
- Flink流处理(三)- 数据流操作
3. 数据流操作 流处理引擎一般会提供一组内置的操作,用于对流做消费.转换,以及输出.接下来我们介绍一下最常见的流操作. 操作分为无状态的(stateless)与有状态的(stateful).无状态的 ...
- vue基础api
vue比jq好处 1jq 频繁操作dom 增加了性能消耗 vue 模拟dom 从内存中拿 2jq 数据没有统一管理 vue 统一管理数据 3vue 组件开发可以提取出公共的html或js mv*好 ...
- Makefile中的wildcard/notdir/patsubst
在Makefile规则中,通配符会被自动展开. 但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTE ...
- macos 杀掉端口 命令行
sudo lsof -i:3000 kill 11111 1111就是pid下面的数字
- 搭建Springboot监控中心报错A attempt was made to call the method reactor.retry.Retry.retryMax(I)Lreactor/ret)
服务器还没启动就报错,是因为jar包的版本没对上,看的视频是SpringBoot2.0 ,现在已经是2.1.7了 将spring-boot-admin-starter-server版本改为最新就ok了
- 任务队列方案详解(一)JVM线程池
前言 我们都知道 web 服务的工作大多是接受 http 请求,并返回处理后的结果.服务器接受的每一个请求又可以看是一个任务.一般而言这些请求任务会根据请求的先后有序处理,如果请求任务的处理比较耗时, ...
- Yum与list结合
我用两台Linux LinuxA IP:192.168.10.101 LinuxB IP:192.168.10.102 首先我们在LinuxA上挂载光驱和安装FTP服务器 然后安装 ...
- leetcode 25. K 个一组翻转链表
# coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...