标准库类型string表示可变长的字符序列,使用string类型必须先包含string头文件,string定义在命名空间std。

#include <string>
using std::string

一、定义和初始化string对象
  一个类可以定义很多种初始化对象的方式,它们之间都有一定的区别,比如初始值的数量不同,或初始值的类型不同,下面为初始化string对象常用的方式:

string s1;                 //默认初始化,s1是一个空字符串
string s2(s1);             //s2是s1的副本
string s2 = s1;            //同上
string s3("hi");           //s3是该字符串字面值的副本,除了字面值最后那个空字符
string s3 = "hi";          //s3是字面值"hi"的副本
string s4(10,'c');         //s4的内容是cccccccccc

1.1 直接初始化和拷贝初始化
  如果使用等号(=)初始化一个变量。实际上执行的是拷贝初始化(copy initialization),编译器把等号右侧初始值拷贝到新创建的对象中去,反之不适应等号,则还行的是直接初始化。

string s5 = "hiya";          //拷贝初始化
string s6("hiya");           //直接初始化
string s7(10,'c');           //直接初始化
string s8 = string(10,'c');  //拷贝初始化

二、string对象上的操作
2.1 读写string对象
  如同使用标准库iostream来读写int、double等内置类型的值,可以使用IO操作符来读写string对象:

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

  在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等),如果程序输入的是” hello world! “,则输出将是“hello”,输出结果没有任何空格。
  下面的程序可以用读取位置数量的string对象:

int main()
{string word;while(cin >> word)cout << word << endl;
   return 0;
}

2.2 使用getline读取一整行
  如果希望在最终得到的字符串中保留输入的空白符,那么应该使用getline函数代替原来的>>运算符,getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读取内容,知道遇到换行符为止(换行符也被读进来),然后把所读内容存到那个string对象中去(不含换行符),即getline函数一遇到换行符就借书读取操作并返回结果,如果一开始就是换行符,那么所得结果是个空string。
  因为getline也会返回它的流参数,所以可以使用getline的结果作为条件,下列程序可以一次输出一整行:

int main()
{string line;while(getline(cin,line))cout << line << endl;return 0;
}

  上面使用endl来结束当前行并刷新显示缓冲区,另外触发getline函数返回的那个换行符实际上被丢弃了,所以得到的string对象不包含换行符。

2.3 string的empty和size、及size返回类型
  empty函数根据string对象是否为空返回一个对应的布尔值:

while (getline(cin,line))if (!line.empty())cout << line << endl;

  size函数返回string对象的长度,即string对象中的个数,下面用size函数输出长度超过80个字符的行:

string line;
while(getline(cin,line))if (line.size() > 80)cout << line << endl;

  size函数返回的是一个string::size_type类型的值,并且这是一个无符号类型的值,即所有存放string类的size函数返回值的变量都是string::size_type类型的,因为size函数返回时一个无符号整型数,所以混用带符号和无符号数可能产生意想不到的结果,假如n是具有负值的int,那么s.size()

string st1 = (10,'c'),st2;   //st1为cccccccccc,st2位一个空字符串
st1 = st2;                   //st1和st2都是空字符串

  两个string对象相加得到一个新的string对象,其内容是把左侧的运算对象与右侧的运算对象串接而成:

string s1 = "hello, ", s2 = "world\n";
string s3 = s1 + s2;          //s3的内容是hello,world\n
s1 += s2;                     //等价于s1 = s1 + s2

  标准库允许把字符字面值和字符串字面值转换成string对象,所以在需要string对象的地方就可以使用这两种字面值来替代:

string s1 = "hello", s2 = "world";
string s3 = s1 + ", " + s2 + '\n';

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

string s4 = s1 + ", ";          //正确,把一个string对象和一个字面值相加
string s5 = "hello" + ", ";     //错误,两个运算对象都不是string s6 = s1 + ", " + "word"; //正确,前面两项相加的结果是一个string对象

  为了与C兼容,C++语言中的字符串字面值并不是标准库类型string的对象,即字符串字面值与string是不同的类型。

三、处理string对象中的字符
3.1 使用基于范围的for语句
  如果需要对string对象中的每个字符进行操作,那么可以使用范围for语句,其语法形式为:

for (declaration: expression)statement

  其中expression部分是一个对象,用于表示一个序列,declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素,每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。

string s("some string!!!");
decltype(s.size()) punct_cnt = 0;
for (auto c : s)              //对于str中的每个字符if (ispunct(c))            //判断其是否为标点符号++punct_cnt;cout << punct_cnt << endl;   //输出符号个数 

  如果需要改变string对象中字符的值,那么必须把循环变量定义成引用类型,引用只是给定对象的别名,因此当使用引用作为循环控制变量时,这个变量实际上被依次绑定到了序列的每个元素上,使用这个引用,就可以改变它绑定的字符。

string s("hello world!!!");
for (auto &c : s)              //对于s中的每个字符(注意c是引用)c = toupper(c)              //c是一个引用,将改变s中字符的值,即换成大写
cout << s << endl;

3.2 使用下标处理string对象
  下标运算符([ ])接收的输入参数是string::size_type类型的值,这个参数表示要访问的字符的位置,返回值是该位置上字符的引用,string对象的下标从0计起,需要注意使用下标时必须确保其在合理范围之内。

for (decltype(s.size()) index = 0;index != s.size();++index)s[index] = toupper(s[index]);

参考文献:
①C++ Primer 第五版。

【C++学习笔记】标准库类型string相关推荐

  1. 标准库类型string的基本功能和使用

    标准库类型string的基本功能和使用 String基本知识 初始化 基本操作 范围for语句 string定义的迭代器及其他 关于下标操作 示例代码 练习3.6 cctype.cpp punctRe ...

  2. C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string

    引言 除了第2章介绍的内置类型之外,C++语言还定义了 -个内容丰富的抽象数据类型库.其中,string和 vector是两种最重耍的标准库类型,前者支持可变长字符串,后者则 表示可变长的集合.还有- ...

  3. C++ 标准库类型 string

    C++ 标准库类型 string 一.string 类型的使用和定义 1.使用 string 类型 标准库类型 string 表示可变长的字符序列 #include <string> us ...

  4. 谈谈两种标准库类型---string和vector

    两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...

  5. C++ primer三章二节标准库类型string

    标准库类型string 标准库类型string表示可变长的字符序列,使用#include<string>引入头文件,string定义在命名空间std中. 定义和初始化string对象 如何 ...

  6. c++ 标准库类型string

    标准库类型string string表示可变长的字符序列,使用string类型必须首先包含string头文件. 文章目录 一.定义和初始化string对象 二.操作string对象 三.处理strin ...

  7. (复健计划)标准库类型string

    标准库类型string表示可变长的字符序列,使用string类型必须包含sring头文件<string>.作为标准库的一部分,string定义在命名空间,string定义在命名空间std中 ...

  8. C++ 标准库类型 string

    写在前面: 我是「虐猫人薛定谔i」,一个不满足于现状,有梦想,有追求的00后 \quad 本博客主要记录和分享自己毕生所学的知识,欢迎关注,第一时间获取更新. \quad 不忘初心,方得始终.自己的梦 ...

  9. 标准库类型String,Vector

    string对象中每个字符的处理: 要用到 for(声明:表达式) 语句 比如简单的打印string str中每一个字符 --- string str("hello world!!!&quo ...

最新文章

  1. runtime 任意类型 model 数据库方便存储
  2. jquery/css需要记录的小知识(持续补充)
  3. 关于Java中final关键字的详细介绍
  4. 华为鸿蒙测试结果,华为鸿蒙OS系统测试结果相继出炉!果然没让花粉们久等:最好的体验...
  5. 我的世界java版tis,我的世界1.7.10~1.8.8 9tis-3d回到汇编的时代mod
  6. centos7的php5.4竟然不支持原生的mysql
  7. 苹果手机说明书_知科技新鲜事 | 华为Mate40系列手机壳曝光:3.5mm耳机孔
  8. pycharm不能输入代码
  9. 计算机网络安全基础知识
  10. php 直播源,【Bilibili直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)...
  11. opencv库函数学习:Rect函数
  12. java变量小明扑克牌_Java模拟扑克牌洗牌实现生成52张扑克的方法示例
  13. opencv通过dll调用matlab函数,图片作为参数
  14. 618电商平台鏖战,天猫618才是绝对主场
  15. PID模型优化(系统辨识工具箱及PID tuner)
  16. “你的下一个显示器,可能是个充电宝!”
  17. 如何使用 FFmpeg 进行图片压缩与制作视频酷游连结
  18. CVPR2022 多目标跟踪(MOT)汇总
  19. DAX基础3:简单介绍Power BI中的New Quick Measures
  20. 菲尼克斯电源 - QUINT-PS/1AC/24DC/20 - 2866776

热门文章

  1. java socket远空_JAVA Socket超时浅析
  2. vue2 与 vue3 生命周期对比
  3. 鼠标滑过图片,图片抖动
  4. 太实用了!Excel VBA常用代码!
  5. mac 不显示 外接屏幕_教大家Mac外接显示器设置教程
  6. MFA 中文国际音标
  7. 论文转换成引用的参考文献格式
  8. 5个国内优秀网站设计案例分享
  9. 4维俄罗斯方块 java_HTML5边玩边学(九)-俄罗斯方块之数据模型篇
  10. miui免root冻结,免root停用miui应用