您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记(七):string类用法及使用大全——在C++11下的使用详解

2015-01-04 14:28 447 查看

一、初始化:

在C++中,string是一个标准库类型,也就是说有了标准库,就可以使用string类。下面介绍一下string的初始化方式:

string s1 默认初始化,s1是个空字符串;

string s2 = s1 s2是s1的一个副本

string s2(s1) 等价于s2 = s1

string s3 = “abcd” 赋字符串

string s3(“abcd”) 等价于 s3 = “abcd”

string s4(n,’a’) 把s4初始化为连续n个a组成的字符串例如 string s4(3,’a’),即s4 = “aaa”



除了以上的方式,还可以使用构造函数初始化,规则如下:

string s1( p ,n) s是p指向的数组中前n个字符串的copy。p是字符指针。此数组中至少有n个字符

string s2(s1,pos2) 从s1下标为pos2的位置copy。pos2应大于s1.size(),即大于s1的长度

string s3(s1,pos3,length) 从s1下标为pos3的位置copy长度为length的字符串。同样pos3应大于s1的长度不管。length值为多少,都只拷贝到s1结束

注意,此处的n,pos2,pos3,length都是无符号整型。
举例如下:

const char *p = “hello_world!!”; //以空字符结尾的数组

char str[] = {‘h’,’e’,’l’,’l’,’o’}; //不是以空字符结尾的数组

string s = “hello_world”;

string s1(p); //s1 = “hello_world!!”

string s2(str); //错误,str是个字符数组,不是字符串,不以空字符结尾,故会报错

string s3(str,2); //s3 = “he”

string s4(p+6,5); //s4 = “world”

string s5(s,6); //s5 = “world!!”

string s6(s,6,5); //s6 = “world”

string s7(s,6,30) //s7 = “world!!”

二、对string一些比较基本的操作:

cout<<s 将s输出

cin>>s 输入字符串s,字符串以空白分隔、结束

getline(cin ,s) 读取一行输入的字符串,包括空格

s.empty() 判断s是否为空,空则返回true

s.size() 返回字符串的长度

s
返回字符串中第n个字符

s1+s2 返回s1,s2连接后的结果

s1 == s2 若两个字符串一样,则相等。

<, <=, >, >= 利用字符的编码比较大小

用法举例及注意事项如下:

1、cin>>s;在执行读取操作,string对象会自动忽略开头的空白(包括空格、换行、制表符等),从第一个真正的字符开始读取,直至遇到下一个空白。若输入“ hello world! ”则s = “hello”。若想读取包括空格在内的字符串,则可以使用getline获取整行的字符串。比如:getline(cin ,s)则s = “ hello world! ”。

2、s.size()的返回值是unsigned int ,若表达式中混用了带符号的数,那么后果可能是无法预测的。

3、关于字符串的比较,其对大小写是敏感的,且比较的依据是字符的ASCII的值的大小。比如string a = “hello”, b =”Hello”, c=”hello world”则字符串比较的结果为c>a>b。字符串的比较后面还会有用compare的介绍。

4、对于string对象的相加操作,要注意必须确保每个加法运算符(+)的两侧至少有一个是string变量。因为不能把一个字符串常量和一个字符串常量相加。比如:

string s = “abcd”;

string s1 = s + “ef”; //正确,s1 = “abcdef”

string s2 = “abcd”+”ef”; //错误,+两边的对象都不是string类型的

string s3 = s+”ef”+”hi”; //正确,s3 = “abcdefhi”

string s4 = “ef”+”hi”+s; //错误,因为运算的关系,导致此表达式是先将”ef”和”hi”相加,故错误

三、使用容器函数对string操作

1、修改string操作

s.substr(pos,n) 返回一个从s的pos开始长度为n的字符串。pos默认是0,n默认是s.size()-pos。故pos应小于s.size()

s.insert(pos,args) 在pos之前插入args指定的字符。pos可以是一个下标或者迭代器。若是下标,则返回一个指向s的引用;若是迭代器,则返回指向第一个插入字符的迭代器

s.erase(pos,length) 删除从pos开始的length个字符。若length缺省,则删除整个字符串,返回一个指向s的引用

s.assign(args) 将s中的字符替换为args指定的内容。返回一个指向s的引用

s.append(args) 在s后加上args指定的内容。返回一个指向s的引用

s.replace(range ,args) 将s中范围为range内的字符换位args指定的内容。rang可以是下标加长度的形式,也可以是一对指向s的迭代器。返回一个指向s的引用。

上面的args情况比较复杂,下面做一下介绍:

args可以是以下的形式:

str字符串str
str,pos,lengthstr中从pos开始最多length个字
cpcp指向的以空字符结尾的字符数组
cp,len从cp指向的字符数组前length个字符
n,cn个字符'c'
b,e迭代器b和e指定范围内的字符
初始化列表花括号包围的以逗号分隔的字符列表
对于前面的函数,append和assign可以使用args的所有形式。而insert和replace所允许的args有与range和pos有关。

关于replace和insert的情况列出如下:

函数名称replacereplaceinsertinsertargs可以是
pos或range

的类型
(pos,length,args)(b,e,args)(pos,args)(iter,args)
×str
××str,pos,length
×cp,length
××cp
n,c
××b,e
××初始化列表

2、搜索string的操作

string类提供了6个不同的搜索函数。每个操作都返回搜索结构位置下标。若搜索失败则返回-1。函数如下:

s.find(args)查找s中args第一次出现的位置
s.rfind(args)查找s中args最后一次出现的位置
s.find_first_of(args)在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args)在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args)在s中查找第一个不在args中的字符
s.find_last_not_of(args)在s中查找最后一个不在args中的字符
其中args必须是以下的几种形式:

c,pos 从s中位置pos开始查找字符c。pos默认为0

s2,pos 从s中位置pos开始查找字符串s2.

cp,pos 从s中位置pos开始查找指针cp指向的以空字符结尾的字符串

cp,pos,n 从s中位置pos开始查找指针cp指向的数组前n个字符。pos和n无默认值

3、比较string的操作

在对string进行比较时,除了可以用前面介绍的关系运算符,还可以用compare函数,根据比较的结果是等于、大于、小于分别返回0,正数,负数。其形参内容如下:

s2比较s和s2
pos1,n,s2将s中从pos1开始的n个字符与s2比较
pos1,n1,s2,pos,n2将s中从pos1开始的n1个字符与s2中从pos2开始的n2

个字符比较
cp比较s与cp指向的以空字符结尾的字符数组
pos1,n,cp将s中从pos1开始的n个字符与cp指向的

以空字符结尾的字符数组
pos1,n1,cp,n2将s中从pos1开始的n个字符与cp指向的

地址开始的n2个字符比较

四、对string中的单个字符操作

见下面博客:C++学习笔记(八)

终于写完了,这里稍稍吐槽一下CSDN的博客编辑界面,这画表格太艰难了。。。。。。。累死我了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: