标准库类型 string 表示可变长的字符序列,使用string类型必须首先包含string头文件,作为标准库的一部分,string 定义在命名空间 std 中,编译时,需要包含以下命令:#include <cstring>
一、定义和初始化string对象:
如何初始化类的对象是由类本身决定的,一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的量不同,或者是初始值的类型不同,下面是几个例子:
string s1; //默认初始化,此时s1是一个空字符串
string s2 = s1; //纯copy过程
string s3= "hiya";
string s4(10,'c'); //s4的内容是 cccccccccc
初始化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组成的串
二、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个字符的引用,位置n从0计起
s1+s2 返回s1和s2连接后的结果
s1=s2 用s2的副本代替s1中原来的字符
s1!=s2 如果s1和s2中所含的字符完全一样,则他们相等;string对象的相等性判断对字母的大小写敏感
s1==s2
<, <= , > , >= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感
2.1 读写string对象
2.1.1 基本操作
int main()
{
string s;
cin >> s;
cout << s << endl;
return 0;
}
需要注意的是,如果程序的输入是“ hello world ”(注意引号内的空格),那么输出将是“hello”,输出结果中没有任何空格。
也就是说,在执行读取操作时,string对象会自动忽略开头的空白(即换行符,空格符,制表符等),并从第一个真正的字符开始读起,直到遇见下一处空白为止。
string s1,s2;
cin >> s1 >> s2;
cout<< s1 << s2 <<endl;
对于上面这段程序,输入同样的内容“ hello world ”,输出将是“helloworld”。
2.1.2 读取未知数量的string对象
string word;
while(cin >> word)
cout << word << endl;
这种写法可以读入数量未知的字符。 while语句在读取时检测流的情况,如果又吓跑,也就是说没有遇到文件结束标记或非法输入,那么执行while语句内部的操作。重复若干次以后,一旦遇到文件结束标记或者非法输入,循环也就结束了。
2.1.3 使用getline读取一整行
有时候我们希望能在最终得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。getline函数的参数是一个输入流和一个string类对象。函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string类对象当中去(注意不存换行符)。getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是一个换行符,那么所得到结果是个空string。
和输入运算符一样,getline也会返回它的流参数。因此既然输入运算符能作为判断的条件,我们也能用 getline 的结果作为条件。
string line;
//每次读入一整行,直至到达文件末尾
while ( getline(cin,line) )
cout<< line << endl; //endl有刷新缓冲区的作用
注意:触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。
2.2 string 的 empty 和 size 操作
顾名思义,empty函数根据string对象是否为空,返回一个对应的bool值。empty是string类的一个成员函数。调用该函数的方法很简单,只要使用点操作符指明是那个对象执行了empty函数就可以了。
while ( getline(cin,line) )
if (!line.empty())
cout<< line <<endl;
你能看出来这个程序和之前相比,作了什么改进吗?
size函数返回string对象的长度,可以这样做:
string line;
while ( getline (cin , line) )
if (line.size() > 80)
cout << line <<endl;
2.3 处理string对象中的字符
我们经常需要单独处理string对象中的字符,比如检查一个string对象是否包含空白,或者把string对象中的字母改为小写,再或者看某个特定的字符是否出现等。下面列出了cctype头文件中的函数:
isalnum(c) 当 c 是字母或数字时为真
isalpha(c) 当 c 是字母时为真
iscntrl(c) 当 c 是控制字符时为真
isdigit(c) 当 c 是数字时为真
isgraph(c) 当 c 不是空格但可打印时为真
islower(c) 当 c 是小写字母时为真
isprint(c) 当 c 是可打印字符时为真 (即c是空格或c具有可视形式)
isspace(c) 当 c 是空白时为真 (c是空格,横、纵向制表符,回车符,换行符中的一种)
isupper(c) 当 c 是大写字母时为真
isxdigit(c) 当 c 是十六进制数字时为真
tolower(c) 如果 c 是大写字母,输出对应的小写字母,否则原样输出 c
toupper(c) 如果 c 是小写字母,输出对应的大写字母,否则原样输出 c
下面给出oj上的几个具体例子,我先慢慢找。。。