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

想快速搞定字符串类题目?使用C++的标准库string类

2014-04-28 13:35 267 查看
   标准库类型 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
                  返回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上的几个具体例子,我先慢慢找。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: