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;
}
  1. 因为line中不包含换行符,所以需要手动的加上换行符。
  2. 触发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的更多相关文章

  1. Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...

  2. Python基础数据类型-字符串(string)

    Python基础数据类型-字符串(string) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版 ...

  3. Javascript基础系列之(三)数据类型 (字符串 String)

    javascript一共有9种数据类型 字符串 String 数值型 Number 布尔型 Boolean 未定义 Undefine 空值 Null 对象 Object 引用Refernce 列表型 ...

  4. Lua基础之字符串(string)

    1,计算字符串长度 2,返回字符串s的n个拷贝 3,返回字符串全部字母大写 4,返回字符串全部字母小写 5,返回一个类似printf的格式化字符串 6,根据下标截取字符串 7,在字符串中查找 8,在字 ...

  5. Java基础 - 字符串 String

    字符串就是用字符拼接成的文本值,字符串在存储上类似数组,在java语言中把字符串当做对象进行处理 创建字符串 package com.mingri.chapter_02; public class d ...

  6. JAVA基础——重新认识String字符串

    深入剖析Java之String字符串 在程序开发中字符串无处不在,如用户登陆时输入的用户名.密码等使用的就是字符串. 在 Java 中,字符串被作为 String 类型的对象处理. String 类位 ...

  7. JavaScript (JS)基础:DOM 浅析 (含数组Array、字符串String基本方法解析)

    ①文本对象document: 例如:document.getElementById()    只获取一个对象          document.getElementsByTagName()   获取 ...

  8. c#编程基础之字符串基础

    1.C#中单个的字符串用单引号包含就是char类型,('a'),单引号中放且只能放一个字符 2.单个字符也可以表示为字符串,还可以有长度为0的字符串. 3.使用s.Length属性来获得字符串中的字符 ...

  9. C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)

    在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...

随机推荐

  1. .net_DevExpress控件使用经验总结

    (转)DevExpress控件使用经验总结DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.本文主要介绍我在使用DevExpress控件过程中,遇到或 ...

  2. xshell配置---文件上传命令rz和下载命令sz

    1.下载安装包 方法一:手动下载安装 1)下载安装包:lrzsz-0.12.20.tar.gz 官网下载地址:http://www.ohse.de/uwe/releases/lrzsz-0.12.20 ...

  3. Nginx可以做什么

    Nginx能做什么 ——反向代理 ——负载均衡 ——HTTP服务器(动静分离) ——正向代理 反向代理 反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(R ...

  4. Bugku - 好多压缩包 - Writeup

    bugku - 好多压缩包 - Writeup M4x原创,转载请注明出处 这道题前前后后做了好几天,这里记录一下 题目 文件下载 分析 解压下载后的文件,发现有68个压缩文件,并且每个压缩文件里都有 ...

  5. Word2010如何从指定页设置页码

    光标定位:将光标定位于需要开始编页码的页首位置.   插入分隔符的”下一页”:选择“页面布局—>分隔符—> 下一页”插入.   插入页码:选择“插入—>页码—> 页面底端”,选 ...

  6. bistoury的源码启动(二)

    bistoury.conf这个东东就是我们代码中的 -Dbistoury.conf=D:\openSource\bistoury\bistoury-proxy\conf 这样就能搞定了,一下子就能启动 ...

  7. docker容器 - 新建容器、启动容器、暂停容器和停止容器

    实验环境 CentOS 7.5 容器 容器是镜像的运行实例.不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层:同时,容器中的应用进程处于运行状态. 新建容器 [root@kvm ~]# ...

  8. Redis06——Redis五大数据类型 list

    list 单键多值 Redis列表是简单的字符串列表,按照插入顺序排序,可以添加左边/右边 底层实际上是一个双向链表,对两端的操作性能好,但是通过索引下标的操作中间节点性能较差  lpush/rpus ...

  9. KMP字符串匹配算法详解

    KMP算法利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). Next()函数 ...

  10. 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...