string类表示可变长字符序列,包含在头文件string中,作为标准库的一部分string定义在std命名空间中
1.初始化string对象
std::string s1;//默认初始化s1是个空字符
std::string s2 = s1;//s2是s1的副本
std::string s3 = "hello";//s3是该字符串字面值的副本
std::string s4(10,'h');s4的内容是hhhhhhhhhh
直接初始化和拷贝初始化
初始化时用到=号的就是拷贝初始化,其在初始化过程中调用了拷贝构造函数
相反,没=号的就是直接初始化,其在初始化过程中没有调用拷贝构造函数
2.string对象上的操作
操作 | 说明 |
---|---|
getline(is,s) | 从is中读取一行赋给s,返回is |
s.empty() | 判断字符串是否为空,为空返回true |
s.size() | 返回s中字符的个数 |
s[n] | 返回s中第n个字符的引用 |
s1+s2 | 返回s1和s2连接后的结果 |
s1=s2 | 用s2的副本代替s1中原来的字符串 |
s1==s2 | 比较是否相等 |
重点操作的说明
(1)使用getline读取一整行
getline可以读取一整行,直到遇到换行符为止,所以它的字符串里允许空格的存在
(2)string::size_type类型
string类及其他大多数标准库类型都定义了几种配套类型。这些配套类型体现了标准库类型与机器无关
由于size函数返回的是size_type类型,因此切记,如果表达式中混用了带符号和无符号的数可能会产生意向不到的结果,例如表达式s.size() < n,如果n是一个负值int那么n会自动转化为一个无符号的值,所以表达式的结果几乎肯定是true
(3)比较运算符==的比较规则与c中的strcmp的比较规则完全相同
(4)处理string对象上的字符
我们可能会处理string对象中的单个字符,比如检查string对象是否包含空白,或者改变某个字符的大小写,在或者看看某个特定的字符是否出现等
在cctype头文件中定义了一组标准库函数处理这部分工作
函数 | 作用 |
---|---|
isalnum(c) | 当c是字母或数字时为真 |
isalpha(c) | 当c是字母时为真 |
iscntrl(c) | 当c是控制字符时为真 |
isdigit(x) | 当c是数字时为真 |
islower(c) | 当c是小写字母时为真 |
isgraph(c) | 当c不是空格但可打印字符时为真 |
isprint(c) | 当c是可打印字符时为真 |
ispunct(c) | 当c是标点符号时为真 |
isspace(c) | 当c是空格时为真 |
isupper(c) | 当c是大写字母时为真 |
tolower(c) | 如果c是大写字母输出对应的小写字母,否则原样输出c |
toupper(c) | 如果c是小写字母,输出对应的大写字母,否则原样输出c |