string是标准库的一部分
Note:标准库对一应用场合来说有足够的效率。
3.2.1 定义和初始化string对象
初始化string对象的方式
string s1 | 默认初始化,s1是一个空串 |
string s2(s1) | s2是s1的副本 |
string s2 = s1 | 同上 |
string s3(“value ”) | s3是字面值“value”的副本,除了字面值最后的空字符除外 |
string s3 = “value” | 同上 |
string s4(n,‘c’) | 把s4初始化为由n个字符c组成的串 |
直接初始化和拷贝初始化
用 = 初始化一个变量,实际上执行的是 拷贝初始化(copy initialization)
不用等号,则执行的是 直接初始化(direct initialization)
3.2.2 string对象上的操作
string的操作
os<<s | 将s写道输出流os中,返回os |
is >> s | 从is中读取字符串赋给s,字符串以空白分割,返回is |
getline(is,s) | 从is流中读取一行赋给s,返回is |
s.empty() | s为空返回true,否则返回false |
s.size() | 返回s中字符的个数 |
s[n] | 返回s中第n个字符的引用,从0开始 |
s1+s2 | 返回s1和s2连接后的结果 |
s1=s2 | 用s2的副本代替s1中原来字符 |
s1==s2,s1!=s2 | 是否完全一样,大小写敏感 |
<,<=,>,>= | 利用字符在字典中的顺序进行比较,大小写敏感 |
读写string对象
cin >> s; 输入遇到空格时停止
如 HELLO WORLD
输出 HELLO
cin >> s1 >> s2;
此时输入 “Hello World”
输出将是 HelloWorld
读取未知数量的string对象
while(cin >> word)
cout<< word << endl;
用getline读取一整行
getline函数的参数是一个输入流和一个string对象
读入内容直到遇到换行符(换行符也读入)
string不存换行符
string line;
while(getline(cin,line))
cout << line << endl;
Note: 触发getline函数返回的那个换行符实际上被丢弃, 得到的stirng对象中不包含该换行符
string的 empty 和 size操作
略 (见上)
string::size_type类型
auto len = line.size();// len的类型是 string::size_type
Tip: 如果有 size()函数就不要使用int,这样可以避免混用int和unsigned可能带来的问题
比较string对象
略
如果较短的string对象和较长的string对象相对位置都相同,则前者小于后者
为string对象赋值
略
两个string相加
略
字面值和string相加
标准库允许把字符字面值和字符串字面值转换成string
但是 + 的两侧至少有一个对象时string,不能拿字面值直接相加
Warning 字符串字面值与string是不同的类型
3.2.3 处理string对象中的字符
在 cctype 头文件中定义了一组 标准库函数处理string
cctype 头文件中的函数
isalnum ( c ) | 当c是字母或数字时为真 |
isalpha( c ) | 当c是字母为真 |
iscntrl ( c ) | 当c是控制字符时为真 |
isdigit( c ) | 当c是数字时为真 |
isgraph ( c ) | 当c不是空格但可打印时为真 |
......
略(百度)
建议:使用c++版本的c标准头文件
来自C语言的头文件如name.h在c++中将这些文件命名为cname
,前面加c
处理每个字符?使用基于范围的for语句
c++11提供 范围for(range for)
语法是:
for(declaration : expression)
statement
expression 部分是一个对象,用于表示一个序列
declaration 部分负责定义一个变量
每次迭代declaration部分都被初始化为expression的一部分
例
string str("some string");
//每行输出str的一个字符。
for(auto c: str)
cout << c <<endl;
适用范围for改变字符串中的字符
如果要改变string对象中字符的值,必须把循环变量定义成引用定义
例:
string s("Hello World!!!");
//转换成大写形式
for(auto &c : s)
c = toupper( c ); //c是引用,因此赋值语句将改变s中字符的值
cout << s << endl;
只处理一部分字符?
想要访问string对象中的单个字符有两种方式:
一种是使用下标,另一种是使用迭代器
下标运算符( [ ] )接受的是string::size_type类型的值(用decltype很重要)
这个参数表示要访问的字符的位置;返回值是该位置上的字符的引用
s[0]是第一个字符
s[s.size()-1]是最后一个字符
Note: string对象下标必须大于0而小于s.size().
使用下标访问空string会引发不也预知的后果
如果索引带符号会自动转换成string::size_type
使用下标执行随机访问
string::size_type n;
while (cin >> n)
......