string是C++标准库最重要的类型之一,string支持长度可变的字符串,其包含在string头文件中。本文摘自《C++PRIMER 第四版·特别版》和个人的一些总结。

一.声明和初始化

  声明前必须在头文件中包含<string>标准库,声明如下:

  1. string s1; //声明一个string对象
  2. string s2[]; //声明一个string对象的数组

  string类型有几种构造函数,所以其初始化方式也有以下几种:

  1. string s1; 默认构造函数,s1为空串
  2. string s2(s1); s2初始化为s1的一个副本
  3. string s3("value"); s3初始化为一个字符串字面值副本
  4. string s4(n,'c'); s4初始化为字符'c'n个副本
  5. string s5(s4.begin(),s4.begin()+s4.size()); s5初始化为迭代器指向的s4的范围的内容
  6. string s6(cp,n); s6初始为cp指向的数组的前n个元素的副本
  7. string s7(s6,pos); s7初始化为一个已存在的string对象s6从下标pos开始的字符的副本
  8. string s8(s7,pos,len); s8初始化为s7从下标pos开始的len个字符的副本,如果pos>s7.size()则操作未定义,无论len为多大,最多只能复制s7.size()-pos个字符

二.读写操作

  读写操作可用标准库的cin和cout,值得注意到是读入操作,从标准输入读取入string对象时:(1)读取并忽略开头的所有空白字符(如空格、换行符、字表符);(2)读取字符直到再次遇到空白字符,读取终止。如果输入"  Hello  World"则屏幕上讲输出"Hello",前后的空白被忽略。

三.常用操作

  下面列出了string对象的常用操作。

  1. s.empty(); 如果s为空串,则返回true,否则返回false
  2. s.size(); 返回s中字符的个数
  3. s[n]; 返回s中位置为n的字符,从0开始计数
  4. s1+s2; s1s2拼接成一个新的字符串,返回新生成的字符串
  5. s1=s2; s1的内容替换为s2的一个副本
  6. s1==s2; 比较s1s2的内容,相等则返回true,否则返回false
    !=,<,<=,>和>=     保持这些操作符惯有的含义

  下面说明上面提到的操作值得注意的地方:

  (1)任何存储string的size操作结果的变量必须为string::size_type类型。特别说明,不要把size的返回值赋值给一个int类型,因为有时int类型的大小不足以装下size返回的值。

  (2)关系操作符!=,<,<=,>,>=比较两个对象时采用了和字典排序相同的策略:如果两个string对象长度不同,且短的对象和长的对象的前面部分相匹配,则短的对象小于长的对象;如果两个string对象的字符不同,则比较第一个不匹配的字符。如:

  1. /*对于下述代码有:s1<s2,s2<s3*/
  2. string s1="Hello";
  3. string s2="Hello World";
  4. string s3="Hiya";

  (3)string对象的加法被定义为拼接,如把s2追加到s1的末尾可直接用s1+=s2表达式即可。当需要string对象和字符串混合拼接时,+操作符的左右操作数中必须有一个是string对象。如

  1. string s1="hello";
  2. string s2="world";
  3. string s3=s1+","; //合法
  4. string s4="hello"+","; //非法,+号两边都没有string对象
  5. string s5=s1+","+"hello"; //合法,s1先和","拼接返回一个string对象,再和"hello"拼接
  6. string s6="hello"+","+s2; //非法,"hello"先和","进行+操作,两个都不是string对象

  (4)由(1)可知,对于string对象的下标操作符的索引(或叫下标)应使用size_type类型,以便于能遍历整个string对象。如下遍历取出string对象的所有字符:

  1. for(string::size_type ix=;ix != s.size();ix++)
  2. cout<<s[ix]<<endl;

四.字符处理

  我们经常要对string对象的单个字符进行处理,在cctype头文件中包含了各种字符操作函数。下面列出了这些函数:

  1. isalnum(c); 如果c是数字或字母,则为true
  2. isalpha(c); 如果c是字母,则为true
  3. iscntrl(c); 如果c是控制字符,则为true
  4. isdigit(c); 如果c是数字,则为true
  5. isgraph(c); 如果c不是空格,但可打印,则为true
  6. islower(c); 如果c是小写字母,则为true
  7. isprint(c); 如果c是可打印的字符,则为true
  8. ispunct(c); 如果c是标点符号,则为true
  9. isspace(c); 如果c是空白字符,则为true
  10. isupper(c); 如果c是大写字母,则为true
  11. isxdigi(c); 如果c是十六进制,则为true
  12. tolower(c); 返回其小写字母形式
  13. toupper(c); 返回其大写字母形式

五.其他操作

1.insert、assign和erase函数

  string类型支持许多容器在操作时都以迭代器为基础,很多操作函数不同容器都能使用,但是不同的容器也会根据需要对函数进行必要的添加或减少。如string和vector中很多操作都是类似的,很多函数也是相同的。如下面列出了string类型和容器类型共有的操作:

  

  1. s.insert(p,t); 在迭代器p所指向的元素之前插入一个值为t的元素。返回指向新插入元素的迭代器
  2. s.insert(p,n,t); 在迭代器p指向的元素之前插入n个值为t的元素。返回void
  3. s.insert(p,b,e); 在迭代器p所指向的元素之前插入迭代器be标记范围内的所有元素。返回void
  4. s.assign(b,e); 用迭代器be标记范围内的元素替换s。对于string类型,返回s;对于容器类型,返回void
  5. s.assign(n,t); nt替换s。对于string类型,返回s。对于容器类型返回void
  6. s.erase(p); 删除迭代器p指向的元素。返回一个迭代器,指向被删除元素后面的元素
  7. s.erase(b,e); 删除迭代器be标记范围内的元素,返回一个迭代器,指向被删除元素后面的第一个元素

  下面为string类型特有的操作版本:

  1. s.insert(pos,n,c); 在下标为pos的元素之前插入n个字符c
  2. s.insert(pos,s2); 在下标为pos的元素之前插入string对象s2的副本
  3. s.insert(pos,s2,pos2,len); 在下标为pos的元素之前插入s2从下标pos2开始的len个字符
  4. s.insert(pos,cp,len); 在下标为pos的元素之前插入cp所指向数组的前len个字符
  5. s.insert(pos,cp); 在下标为pos的元素之前插入cp所指向的以空字符结束的字符串副本
  6. s.assign(s2); s2的副本替换s
  7. s.assign(s2,pos2,len); s2从下标pos开始的len个字符替换s
  8. s.assign(cp,len); cp所指向数组的前len个字符替换s
  9. s.assign(cp); cp所指向的以空字符结束的字符串副本替换s
  10. s.erase(pos,len); 删除从下标pos开始的len个字符
  11. /*除非特殊说明,上述所有操作都返回s的引用*/

2.append和replace函数

  string类型提供了容器类型不支持的几种操作:append、replace、substr和一系列find函数。其中append和replace函数用于修改string对象。append操作提供了在字符串尾部插入的捷径。replace操作用于删除指定一段范围内的字符,然后在删除位置插入一组新字符,等效于调用insert和erase函数。

  1. /*修改string对象的操作,arg在下表*/
  2. s.append(args); args串接在s后面。返回s的引用
  3. s.replace(pos,len,args); 删除s中从下标pos开始的len个字符,用args指定的字符替换之,返回s的引用
  4. s.replace(b,e,args); 删除迭代器be标记的范围内所有的字符,用args替换它。返回s的引用

  

  1. /*append和replace操作的参数:args*/
  2. s2 string类型的字符串
  3. s2,pos,lens 字符串s2从下标pos开始的lens个字符
  4. cp 指针cp指向的以空字符结束的数组
  5. cp,len2 cp指向的以空字符结束的数组的前len2个字符
  6. n,c 字符cn个副本
  7. b2,e2 迭代器b2e2标记范围内的所有字符

3.子串操作substr函数

  使用substr操作可以在指定的string对象中检索需要的子串。

  1. s.substr(pos,n); 返回一个string类型的字符串,它包含从s从下标pos开始的n个字符
  2. s.substr(pos); 返回一个string类型的字符串,它包含从下标pos开始到s的末尾的所有字符
  3. s.substr(); 返回s的副本

4.查找操作find函数

  string类提供了6种查找函数,每种函数以不同形式的find命名。这些操作全都返回string::size_type类型的值,以下标的形式返回匹配的位置。当没有匹配到时返回一个string::npos的特殊值。npos定义为保证大于任何有效的下标值。

  

  1. /*string类型的查找操作,其参数args在下表*/
  2. s.find(args); s中查找args的第一次出现
  3. s.rfind(args); s中查找args的最后一次出现
  4. s.find_first_of(args); s中查找args的任意字符的第一次出现
  5. s.find_last_of(args); s中查找args的任意字符的最后一次出现
  6. s.find_first_not_of(args); s中查第一个不属于args的字符
  7. s.find_last_not_of(args); s中查找最后一一个不属于args的字符

  每个查找都有四个重载版本,如下表:

  1. c,pos s中,从下标pos标记的位置开始,查找字符cpos的默认值为0
  2. s2,pos s中,从下标pos标记的位置开始,查找string对象s2pos的默认值为0.
  3. cp,pos s中,从下标pos标记的位置开始,查找指针cp指向的一空字符结束的字符串。pos的默认值为0.
  4. cp,pos,n s中,从下标pos标记的位置开始,查找指针cp所指向的数组的前n个字符。pos的默认值为0.

5.比较操作compare函数

  compare函数用于实现string类型的字典顺序的比价。compare返回下面是三种可能之一:

  (1)正数,此时s1大于args所代表的string对象。

  (2)负数,此时s1小于args所代表的string对象。

  (3)0,相等。

  1. s.compare(s2); 比较ss2
  2. s.compare(pos1,n1,s2); s中从pos1下标位置开始的n1个字符与s2做比较
  3. s.compare(pos1,n1,s2,pos2,n2); s中从pos1下标位置开始的n1个字符与s2中从pos2开始的n2个字符相比较
  4. s.compare(cp); 比较scp所指向的以空字符结束的字符串
  5. s.compare(pos1,n1,cp); s中从pos1下标位置开始的n1个字符与cp所指向的以空字符结束的字符串比较
  6. s.compare(pos1,n1,cp,n2); s中从pos1下标位置开始的n1个字符与cp所指向的字符串的前n2个字符串比较

参考文献

C++ PRIMER》 中文版

  

C++标准库string类型的使用和操作总结的更多相关文章

  1. C++标准库vector类型的使用和操作总结

    vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...

  2. C++标准库string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...

  3. 【C++ Primer每日刷】之三 标准库 string 类型

    标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...

  4. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

  5. 标准库string类型简述

    若想使用标准库的string类需要使用如下声明: #include <string> Using std::string: Using std::wstring: 那么就可以使用这两个类了 ...

  6. 标准库string类型

    一.string 对象的定义和初始化的方式 1. string s1: 2. string s2(s1): 3. string s3("hello"); 4. string s4( ...

  7. 把《c++ primer》读薄(3-3 标准库bitset类型)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...

  8. C++标准库<string>简单总结

    C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...

  9. C 标准库 - string.h

    C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays. stri ...

随机推荐

  1. HI3531编译helloworld,执行错误

    若在嵌入式系统中执行某文件出现如下错误: -/bin/sh: XXX: not found 一般是因为缺少库文件,解决方法有2: 1,文件系统的busybox编译时使用动态编译方式 2,或编译该文件的 ...

  2. SSH2三大框架SQL查询

    /** * 查询省份名称 * @author YHD * @return * @see */ @SuppressWarnings("unchecked") @Override pu ...

  3. file_get_contents函数不能使用的解决方法

    今天开发微信公众平台的时候 使用file_get_contents 去获得token 结果一直返回false.百度了一下,大部分都是说用curl 偶然发现可能是openssl没有开启的问题,开启ope ...

  4. R语言︱常用统计方法包+机器学习包(名称、简介)

    一.一些函数包大汇总 转载于:http://www.dataguru.cn/thread-116761-1-1.html 时间上有点过期,下面的资料供大家参考基本的R包已经实现了传统多元统计的很多功能 ...

  5. zTree实现获取一级节点数据

    zTree实现获取一级节点数据 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</t ...

  6. 关于spring事务注解实战

    1.概述 spring的事务注解@Transaction 相信很多人都用过,而@Transaction 默认配置适合80%的配置. 本篇文章不是对spring注解事务做详细介绍,而是解决一些实际场景下 ...

  7. Java 8 Date-Time API 详解

    从Java版本1.0开始就支持日期和时间,主要通过java.util.Date类. 但是,Date类设计不佳. 例如,Date中的月份从1开始,但从日期却从0开始.在JDK 1.1中使用它的许多方法已 ...

  8. Python编程核心内容之二——切片、迭代和列表生成式

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 最近太忙啦.很多事情需要自己处理,感觉时间不够用啊~~~~今后,博客更新时间可能会慢下来,哈哈,正所谓"人 ...

  9. [CQOI2007]余数求和

    大于k的部分直接加k 对于小于等于k的cnt个数 ans=cnt*k - Σ(k/i * i) 然后k/i在一段区间内不变,这段区间直接可以数列求和 # include <bits/stdc++ ...

  10. 设置mysql密码 Access denied 问题

    原文:http://www.upwqy.com/details/31.html 在Mac上安装完mysql以后 在终端执行 /usr/local/mysql/bin/mysql 可以直接进入.但是在设 ...