string类型支持长度可变的字符串,C++标准库负责管理与存储字符相关的内存,以及提供各种操作。使用时必须包含头文件
#include<string>
using std::string;//如果使用using声明则编写更加简单
1.string对象的定义与初始化
string标准库支持几个构造函数。构造函数是一个特殊的成员函数,定义如何初始化该类型的对象。 string s1;//默认构造函数,s1为空串 string s2(s1);//初始化s2为s1的副本 string s3("value");//将s3初始化为一个字符串字面值的副本 string s4(n,'c');//将s4初始化为字符‘c’的n个副本
2.string对象的读写
#include<iostream> #include <string> using namespace std; int main(){ /* string cin>>s1 读取并忽略开头所有空白字符(如空格 换行 制表) 读取字符直至再次遇到空白字符,读取终止 如果输入的是" hello world " 那么输出的结果是" */ string s1; cin >> s1; cout << s1 << endl; system("pause"); return EXIT_SUCCESS; }
2.1读入未知数目的string对象
string的输入操作符与内置数据类型的输入操作符一样 string的输入操作符也会返回所读的数据流,因此可以把输入操作符作为判断条件
string word; while (cin >> word){ cout << word << endl; }
用输入操作符来读取string对象。该操作符返回所读的istream对象,并在读取结束后 ,作为while的判断条件。如果输入流是有效的,即未达到文件尾且未遇到无效输入,则执行while循环体,并将读取到的字符串输出到标准输出。如果达到了文件尾则跳出while循环。
2.2用getline读取整行文本
另外还有一个有用的string IO操作 getline 这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作不一样的是getline 并不忽略行开头的换行符,只要getline遇到换行符,即便是她输入的第一个字符getline也将停止并读入返回。如果第一个字符就是换行符,则string参数将被置为空。
getline函数将istream参数作为返回值,和输入操作一样也把它用作判断条件。
while (getline(cin, word)) { if (word.size() == 0) break; cout << word << endl; }
2.3 string对象的操作
string s; s.empty(); //如果s为空串 则返回true 否则返回false s.size();//返回s中字符个数 //s[n];//返回s中位置为n的字符,位置从0开始计数 //s1 + s2;//把s1与s2连接成一个新字符串,返回新生成的字符串 //s1 = s2;把s1的内容替换为s2的副本 //v1 == v2;比较v1和v2中的内容 相等返回true 否则返回false //!= , < , <= ;保持这些操作符惯有的含义 //> 和<=
1.string 的size和empty操作
判断string对象是否为空一种方法就是判断s.size()==0,另一种就是s.empty()==true
2.string::size_type类型
从逻辑上讲size()成员函数似乎返回整形的数值,但是实际上返回的类型是string::size_type()类型的值
string类类型和许多其他库都定义了一些配套类型(companion type)通过这些配套类型,库类型的使用就可以与机器无关(machine-independent)size_type就是这些配套类型中的一种,他定义为与unsigned(unsigned int,unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为了使由string类型定义的size_type类型,程序员必须加上作用于操作符来说明所使用的是由string类定义的。
3.string 关系操作符
== 操作符是比较两个string对象,如果它们相等,则返回true 两个string对象相等指的是他们的长度相同,且含有相同的字符。标准库还定义了!=操作符来测试两个string对象是否不等。
关系操作符采用的是大小写敏感的字典排序的策略
+ 如果两个string对象长度不同,且短的string对象与长的string对象的前面部分相匹配,则短的string对象小于长的对象
+ 如果两个对象的字符不同,则比较第一个比匹配的字符
4 string对象的赋值
总体上说,标准库类型尽量设计得和基本数据类型一样方便易用。因此大多数库类型支持赋值操作。对string对象来说 可以把一个string对象赋值给另一个string对象
string s1,s2="hello";
s1=s2;
赋值操作后,s1就包含了s2串所有字符的副本。
大多数string库类型的赋值等操作的实现都会遇到一些效率上的问题,值得注意的是,从概念上江,赋值操作确实需要做一些工作。必须先把s1占用的相关内存释放掉,然后再分配给s1足够存放s2副本的内存空间,最后把s2中的所有字符复制到新分配的内存空间。
5.两个string对象相加
string对象的加法被定义为连接concatenation,也就是说两个或多个string对象可以通过使用加操作符或者复合赋值操作符+=连接起来
string s1 = "hello"; string s2 = "world"; string s3 = s1+s2; s1+=s2
6.和字符串面值的连接
当进行string对象和字符串面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的,“这里猜测是string类型重载了+操作符”
所以有
string s1="nihao"; string s4 ="hello"+"world";这个是错误的 string s5=s1+"hello"+"world";这个是正确的 string s6 = "hello"+"wolrd"+s1; 这个也是错误的
7string对象获取字符
string类型可以通过下标操作符([])来访问string对象中的单词个数。下标操作符需要取一个size_type类型的值,来标明要访问字符的位置。这个下标中的值通常被称为下标或索引
8下标操作可用作左值
for(string::size_type ix=0;ix!=str.size();++ix){ str[ix] ='*'; }
9计算下标值
注意使用的过程中尽量使用string::size_type类型
2.4string对象中字符的处理
下列各种字符操作函数适用于string对象的字符,这些函数都位于cctype头文件中定义
isalnum(c) //如果c是字母或数字则为true isalpha(c) //如果c是字母则返回true iscntrl(c)//如果是控制字符则为true isdigit(c)//如果c是数字 则为true isgraph(c)//如果不是空格但可以打印 则为true islower(c)如果c是小写字母 则为true isprint(c)如果是可以打印的字符则为true ispunct(c)//如果是标点符号则为true isspace(c)如果是空白字符则为true isupper(c)如果是大写字母 则为true isxdigit(c)如果c是16进制则为true tolower(c)如果是大写字母则返回其小写字母形式,否则直接返回c toupper(c)如果是小写字母则返回其大写字母形式,否则直接返回c